Như bạn chỉ ra, điều này sẽ biên dịch:
interface MyInterface {}
class A {}
public class InterfaceCasting {
public static void main(String[] args) {
MyInterface myObject = new MyInterface() {};
A a = (A) myObject;
}
}
này tuy nhiên, sẽ không biên dịch:
interface MyInterface {}
class A {}
public class InterfaceCasting {
public static void main(String[] args) {
A a = (A) new MyInterface() {}; // javac says: "inconvertible types!"
}
}
Vì vậy, những gì đang xảy ra ở đây? Có gì khác biệt?
Vâng, kể từ MyInterface
chỉ đơn giản là một giao diện, nó thể rất tốt được thực hiện bởi một lớp mà kéo dài Một, trong trường hợp các diễn viên MyInterface
-A
sẽ là hợp pháp.
Mã này ví dụ, sẽ thành công trong 50% của tất cả các hành, và minh họa rằng trình biên dịch sẽ cần phải giải quyết vấn đề có thể undecidable để luôn "phát hiện" diễn viên bất hợp pháp tại thời gian biên dịch.
interface MyInterface {}
class A {}
class B extends A implements MyInterface {}
public class InterfaceCasting {
public static void main(String[] args) {
MyInterface myObject = new MyInterface() {};
if (java.lang.Math.random() > 0.5)
myObject = new B();
A a = (A) myObject;
}
}
tôi nghĩ bạn phải xem lại các khái niệm về ngoại lệ Java ... – ultrajohn