我看到了这段代码:
interface I{}
class A implements I{}
class B extends A{}
class C extends B{}
class ABC
{
public static void main(String args[])
{
A a=new A();
B b=new B();
a=(B)(I)b; //Line 1
b=(B)(I)a; //Line 2
a=(I)b; //Line 3
I i=(C)a; //Line 4
}
}
试图找出
任何人都可以向我解释这三个概念吗?
答案 0 :(得分:0)
在java中,类似于类的接口是一种类型。在你的例子中,A类的对象属于A类,属于I类.B类的对象是B型,类型(子类型)A和类型I.C类的对象是C型,类型(子类型)B,类型(子类型)A和类型I.注意,对象是两种类型的类型(两种类型没有相互链接,即A和I是独立的类型)和它们各自超类的子类型。
根据Leskov的替换委托人,您可以代替超类型(超类)来获得子类型(子类)。为了说明下面的代码片段:
public class InheritanceTest {
public interface I{}
public class A implements I{}
public class B extends A{}
public class C extends B{}
public class D implements I{}
public class E{}
public void method(){
A a=new A();
B b=new B();
C c=new C();
D d=new D();
I i=null;
i=a;i=b;i=c;
a=b;
b=c;
a=c;
a=(A)i;//a=i does not work, A and I are two different types
i=d;
a=(A)i;//ClassCastException at runtime, D is not an A
E e=new E();
//a=(A)e; - this generates a compile time error
}//method closing
} //关闭课程
强制转换是必要的,因为根据代码,所有As都是Is但是所有Is都不是因为我可以有一个D类实现了我但是完全没有连接到A继承层次结构。一般情况下,当你必须在两个未连接的类型之间进行转换时,你需要进行转换。
注意:我已编辑代码以包含另一个D类 注意:我已编辑代码以包含另一个类E