接口中的 Java 转换 [英] Java casting in interfaces
问题描述
有人可以向我解释一下编译器如何在第一次转换时没有抱怨,但在第二次转换时却抱怨吗?
Can someone please explain to me how the compiler does not complain in the first casting, but does complain in the second?
interface I1 { }
interface I2 { }
class C1 implements I1 { }
class C2 implements I2 { }
public class Test{
public static void main(String[] args){
C1 o1 = new C1();
C2 o2 = new C2();
Integer o3 = new Integer(4);
I2 x = (I2)o1; //compiler does not complain
I2 y = (I2)o3; //compiler complains here !!
}
}
推荐答案
当你使用 (I2)
转换 o1
和 o3
时,你告诉编译器该对象的类实际上是其声明类型的子类,并且该子类实现了 I2
.
When you cast o1
and o3
with (I2)
, you tell the compiler that the class of the object is actually a subclass of its declared type, and that this subclass implements I2
.
Integer
类是 final,所以 o3
不能是 Integer
的子类的实例:编译器知道你在撒谎.C1
然而不是最终的,所以 o1
可能 是实现 的
.C1
子类型的实例I2
The Integer
class is final, so o3
cannot be an instance of a subclass of Integer
: the compiler knows that you're lying. C1
however is not final, so o1
could be an instance of a subtype of C1
that implements I2
.
如果你把 C1
设为 final,编译器也会抱怨:
If you make C1
final, the compiler will complain too:
interface I1 { }
interface I2 { }
final class C1 implements I1 { }
class C2 implements I2 { }
public class Test{
public static void main(){
C1 o1 = new C1();
C2 o2 = new C2();
Integer o3 = new Integer(4);
I2 y = (I2)o3; //compiler complains here !!
I2 x = (I2)o1; //compiler complains too
}
}
这篇关于接口中的 Java 转换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!