Java SDK10:是否明确要求强制转换?

TMO*_*TTM 3 java

我正在编写一本基于JDK 8的Java书.在关于继承和泛化的章节中,显示了以下示例:

class A {}
class B extends A {}
class C1 extends B { public void x1() {System.out.println("C1.x1");} }
class C2 extends B { public void x2() {System.out.println("C2.x2");} }
Run Code Online (Sandbox Code Playgroud)

然后,声明一些对象变量,所有类型A:

A obj1, obj2, obj3, obj4;
Run Code Online (Sandbox Code Playgroud)

这些变量用四个类的实例填充:

obj1 = new A();
obj2 = new B();
obj3 = new C1();
obj4 = new C2();
Run Code Online (Sandbox Code Playgroud)

现在,obj3.x1()因为obj3属于类型Ax1()无效,并且未定义A.在本书中,现在可以声明一个新obj5的类型变量C1并为其赋值obj3:

C1 obj5 = obj3; // then obj5.x1() should work
Run Code Online (Sandbox Code Playgroud)

但是在这一行上我得到了一个Incompatible Types编译错误.

SDK8和10之间有什么不同吗?或者我在某个地方错过了一些错误?

作为旁注:铸造如在C1 obj5 = (C1) obj3工作中.

glg*_*lgl 5

通过强制转换,您告诉编译器您认为分配是正确的,因为您认为obj3它是类型C1.然后编译器相信你并继续.

如果你撒谎,你会得到一个运行时异常.如果没有,一切都很好.