Como usted señala, esto hará de compilación:
interface MyInterface {}
class A {}
public class InterfaceCasting {
public static void main(String[] args) {
MyInterface myObject = new MyInterface() {};
A a = (A) myObject;
}
}
Este sin embargo, se no de compilación:
interface MyInterface {}
class A {}
public class InterfaceCasting {
public static void main(String[] args) {
A a = (A) new MyInterface() {}; // javac says: "inconvertible types!"
}
}
Entonces, ¿qué está pasando aquí? ¿Cual es la diferencia?
Bueno, ya MyInterface
es simplemente una interfaz, que podía muy bien ser implementada por una clase que extienda Una, en cuyo caso el CAST de MyInterface
a A
sería legal.
Este código, por ejemplo, se tener éxito en el 50% de todas las ejecuciones, e ilustra que el compilador tendría que resolver problemas indecidibles posiblemente con el fin de siempre "detectar" vaciados de ilegales en tiempo de compilación.
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;
}
}
Creo que tiene que revisar los conceptos en Java Exception ... – ultrajohn