簡體   English   中英

接口類對象,鑄造,異常

[英]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
    }
}

試圖找出

  1. 哪種方法可以進行安全的轉換,即沒有編譯時間或運行時錯誤
  2. 在什么情況下強制轉換將顯示編譯時錯誤
  3. 在什么情況下強制轉換將顯示運行時異常

誰能向我解釋這三個概念?

在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM