With a little change, your code will work:
interface Foo {
}
class Beta implements Foo {
}
public class Main extends Beta{
public static void main(String[] args) {
Beta x = new Beta();
Foo f = x;
}
}
But this change for the code to work is clearly not enough to get a full idea of why the source code does not work, so I will try to explain a bit of the logic of inheritance and the use of translations in java:
-, /:
Foo
^
| (implements)
Beta
^
| extends
Main
, :
... . :
, Main, : OO.
, ClassCastException.
instanceof boolean isAssignableFrom(Class<?> cls) ( :)
interface Foo {
}
class Beta implements Foo {
}
public class Main extends Beta {
public static void main(String[] args) {
Beta b = new Beta();
Main m = new Main();
System.out.println("is m an instance of Foo ? : " + (m instanceof Foo));
System.out.println("is b an instance of Foo ? : " + (b instanceof Foo));
System.out.println("is m an instance of Beta ? : " + (m instanceof Beta));
System.out.println("is b an instance of Beta ? : " + (b instanceof Beta));
System.out.println("is m an instance of Main ? : " + (m instanceof Main));
System.out.println("is b an instance of Main ? : " + (b instanceof Main));
System.out.println("is a variable of type Foo assignable a from a Foo instance ? : "
+ Foo.class.isAssignableFrom(Foo.class));
System.out.println("is a variable of type Main assignable from a Main instance ? : "
+ Main.class.isAssignableFrom(Main.class));
System.out.println("is a variable of type Beta assignable from a Beta instance ? : "
+ Beta.class.isAssignableFrom(Beta.class));
System.out.println("is a variable of type Foo assignable from a Beta instance ? : "
+ Foo.class.isAssignableFrom(Beta.class));
System.out.println("is a variable of type Foo assignable from a Main instance ? : "
+ Foo.class.isAssignableFrom(Main.class));
System.out.println("is Main assignable from Beta ? : " + Main.class.isAssignableFrom(Beta.class));
System.out.println("is Main assignable from Foo ? : " + Main.class.isAssignableFrom(Foo.class));
System.out.println("is Beta assignable from Main ? : " + Beta.class.isAssignableFrom(Main.class));
System.out.println("is Beta assignable from Foo ? : " + Beta.class.isAssignableFrom(Foo.class));
Foo fb = b;
Foo fm = m;
System.out.println("is fm an instance of Main ? : " + (fb instanceof Main));
System.out.println("is fb an instance of Beta ? : " + (b instanceof Beta));
Beta bm = m;
Foo fbm = bm;
System.out.println("is bm an instance of Main ? : " + (fb instanceof Beta));
System.out.println("is fbm an instance of Main ? : " + (b instanceof Main));
}
}
, , ? , . , :
Object o = m;
Foo f2 = (Foo)o;
Beta b2 = (Beta)o;
Main m2 = (Main)o;
Beta b3 = m;
Main m3 = (Main)b3;
- - , ( instanceof isAssignableFrom(), ).