[英]Interface-Class-Object,Casting,Exception
我看到了以下代碼:
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
}
}
試圖找出
誰能向我解釋這三個概念?
在Java中,類似於類的接口是類型。 在您的示例中,類A的對象是類型A,類型I。類B的對象是類型B,類型(子類型)A和類型I。類C的對象是類型C,類型(子類型B),類型B。 (子類型)A和類型I。如所注意到的,對象是2種類型的類型(這兩種類型彼此沒有鏈接,即A和I是獨立類型),並且是它們各自的超類的子類型。
根據萊斯科夫的替代原則,您可以替代一個超類型(超類),使用一個子類型(子類)。 為了說明,請看下面的代碼片段:
公共類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
} //課程結束
強制轉換是必需的,因為按照代碼,所有的全部為Is,但所有的全部都不為As,即我可以擁有一個D類,該類實現了I但與A繼承層次結構完全無關。 通常,當您必須在兩個未連接的類型之間進行轉換時,需要進行強制轉換。
注意:我已經編輯了代碼以包括另一個類D注意:我已經編輯了代碼以包括另一個類E
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.