让我们以类图为例
我在java中创建了类似的类,如下所示
public class B {
}
public interface C {
}
public class A extends B implements C {
}
public class D {
C c = new A();
C c1 = new B(); // Error, Type mismatch: cannot convert from B to C. WHY ?
C c2 = (C) new B(); // Works fine. This makes me confuse ... What does this actually mean ?
}
有人可以解释一下吗?
答案 0 :(得分:1)
C c1 = new B()
您永远不能将B类实例化为接口C,因为它没有实现接口C.
C c2 = (C) new B()
在第二种情况下,您明确地将B的实例强制转换为C类。编译器允许这样做,但是您将获得运行时异常。
答案 1 :(得分:1)
为什么C c2 = (C) new B();
无法编译:请参阅Ankur Shanbhag的回答。
C c2 = (C) new B();
可以很好地编译,但由于c2
是B
对象,因此无法转换为C
,这将在运行时抛出异常。
我做了一个例子:
public class D {
public static void main(String[] args) {
C c2 = (C) new B();
System.out.println(c2);
}
}
并收到例外:
Exception in thread "main" java.lang.ClassCastException: casting.B cannot be cast to C
答案 2 :(得分:0)
C c1 = new B(); // Error, Type mismatch: cannot convert from B to C. WHY ?
您只能通过超类引用来引用派生类。在您的情况下,C
不是B
的超类。因此错误
C c2 = (C) new B(); // This makes me confuse ... What does this actually mean ?
编译器不允许您执行上述转换。要从一种类型转换为另一种类型,这两个类必须位于同一个对象层次结构中。
答案 3 :(得分:0)
延伸意味着“是一种”。
A
是一种B
,因此它具有B
的所有功能。
但是,B
不是一种A
,因此它不一定具有A
的所有功能,包括实施{ {1}}。这就是你输入类型不匹配的原因。
但在这种情况下:
interface C
Casting 告诉编译器“不要检查这个,因为我知道我在做什么。”所以它可以编译。
但是如果在运行时,实际强制转换的对象无法输入为C c2 = (C) new B()
,那么您将获得C
。在您的情况下,您将ClassCastException
投射到B
,而C
不是B
,而是C
A
}}。所以你会得到例外。