Ris*_*ard 2 java casting interface
我正在寻找使用Java进行转换,特别是使用接口进行转换.假设我有一个I定义方法跳转的接口,即:
interface I{
public void jump();
}
Run Code Online (Sandbox Code Playgroud)
另外假设我有3个其他类A,B和C.A实施I.B才不是.但是,C扩展B和实现I.
class A implements I {
public void jump(){
System.out.print("A is jumping");
}
}
class B { }
class C extends B implements I {
public void jump(){
System.out.print("C is jumping");
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试将类型的对象分配A给a I,则没有问题,我甚至不需要演员.即:
I i = new A();
Run Code Online (Sandbox Code Playgroud)
没关系,不需要施放.
大概这是因为编译器知道A实现了I.此外,如果我尝试这样做:
A mya = new A();
I i = mya;
Run Code Online (Sandbox Code Playgroud)
没有问题,即使mya可能引用的子类A.但AFAIK没问题,因为编译器知道每个子类A必须隐式实现该jump方法,因此必须实现接口A.
但是,如果我尝试将类型的对象分配B给a I,那么我需要一个强制转换.例如
B myb = new B();
I i = (I)myb;
Run Code Online (Sandbox Code Playgroud)
大概这是因为编译器知道B没有实现I.但是,既然B可以引用一个确实实现的子类I,那么你可以转换为I.到现在为止还挺好.现在这里是我的问题:如果我想分配一个类型B的对象引用类型C(实现I)的对象,I那么我们需要一个强制转换.这是为什么?例如
B b = new C();
I myI = b; //Won't compile this needs a cast
I myI = (C)b; // This will compile
myI = (I)b; // This will also compile
Run Code Online (Sandbox Code Playgroud)
为什么编译器不理解B指的C是实现I的?
据推测,这与B可以引用B哪个实际上没有实现的事实有关,I但为什么编译器不知道呢?据推测,编译器仅限于每行可用的信息?它不能运行你的程序,看到它b实际上指向一个C?如果这是正确的,有人可以指向我关于Java编译器如何工作以及它们的局限性的一些文献的方向吗?
大概这是因为编译器知道B没有实现I,但是因为B可以引用实现I的子类,所以你可以转换为I.
不完全是.编译器将允许您根据需要投射B. 这并不意味着你不会ClassCastException在运行时得到它.(这段时间你的代码会工作,但编译器不会阻止你制作糟糕的演员表.)
为什么编译器不理解B指的是实现I的C?据推测,这与B可以引用实际上没有实现I的B这一事实有关,但为什么编译器不知道这一点.
因为你告诉它将对象视为B你声明的时间B b = new C();
据推测,编译器仅限于每行可用的信息?它无法运行你的程序,并看到b实际上指向ac?
它可以访问其余代码.它只是做你告诉它要做的事:b作为一个阶级的对象B.