首先阅读java 的显式和隐式类型转换。
在缩小对象关系时,该用户负责显式转换,以表示用户知道并且可以因此而失去一些精度。CE: Type mismatch error
然而,编译器仍然可以检测到一些明确的错误转换并在某个时候抛出。除此之外,由运行时ClassCastException
来处理它。
编译器可以检测以下显式转换的情况。
class A {}
class B {}
A a = (A) new B(); //CE: Type mismatch: cannot convert from B to A
B b = (B) new A(); //compilation error (CE)
interface I {}
final class A {}
I i = (I) new A(); //compilation error
编译器无法检测到以下显式转换的情况。
class A {}
class B extends A {}
A a = (A) new B(); //Fine
B b = (B) new A(); //Runtime error; because compile time;
//compiler wont be able to tell the reference is instance of A or B.
//means this is something like below. <BR>
B b = (B) (A) new A();
任何对象都可以被强制转换为任何接口而不会出现编译错误。
interface I {}
class A {}
class B extends A implements I{}
I i = (I) new A(); //Runtime error
I i = (I) new B(); //Fine
为什么会这样编译?
接口的引用可以转换为任何对象而不会出现编译错误。
interface I {}
class A implements I {}
class B {}
B b = (B) getI(); //Runtime error
OR
B b = (B)(I)new A(); //Runtime error
public I getI() {
return new A();
}