簡體   English   中英

用於投射的Java規則

[英]Java rules for casting

何時可以將某個對象轉換為另一個對象? 鑄造對象是否必須是另一個對象的子類型? 我正試圖找出規則......

編輯 :我意識到我根本沒有解釋我的問題:基本上我正在將一個對象轉換為接口類型。 但是,在運行時,我得到一個java.lang.ClassCastException 我的對象需要發生什么才能將其轉換為此接口? 是否必須實施它?

謝謝

在Java中,有兩種類型的引用變量:

  • 向下轉換 :如果您有一個引用子類型對象的引用變量,則可以將其指定給子類型的引用變量。 您必須進行顯式轉換才能執行此操作,結果是您可以使用此新引用變量訪問子類型的成員。

  • 上傳 :您可以顯式或隱式地將引用變量分配給超類型引用變量。 這是一種固有的安全操作,因為賦值限制了新變量的訪問能力。

是的 ,您需要直接或間接地實現接口,以便將類對象引用分配給接口類型。

假設我們想將d對象轉換為A,

A =(C)d;

因此編譯器和JVM已經檢查了內部3個規則。 編譯器在編譯時檢查前2個規則,JVM將在運行時檢查最后一個規則。

規則1(編譯時間檢查):

'd'和C的類型必須有一些關系(子到父或子到子或同一時間)。如果沒有關系,那么我們將得到編譯錯誤(不可轉換的類型)。

規則2(編譯時間檢查):

'C'必須是'A'的相同類型或派生類型(子類),否則我們將得到編譯錯誤(不兼容的類型)。

規則3(運行時異常):

運行時對象類型'd'必須相同或派生類型為'C'否則我們將獲得運行時異常(ClassCastException異常)。

找到以下示例以獲得更多想法,

String s = new String("hello"); StringBuffer sb = (StringBuffer)s;  // Compile error : Invertible types because there is no relationship between.

Object o = new String("hello"); StringBuffer sb = (String)o;       // Compile error : Incompatible types because String is not child class of StringBuffer.

Object o = new String("hello"); StringBuffer sb = (StringBuffer)o; // Runtime Exception : ClassCastException because 'o' is string type and trying to cast into StingBuffer and there is no relationship between String and StringBuffer.

這將有效:

class Foo implements Runnable {
    public void run() {}
}

Foo foo = new Foo();
System.out.println((Runnable) foo);

但這不會:

class Bar {
    public void run() {}
}

Bar bar = new Bar();
System.out.println((Runnable) bar);

因為雖然Bar有一個可以實現Runnable.run()run()方法, 但是沒有聲明Bar實現Runnable所以它不能被強制轉換為Runnable

Java要求您按名稱聲明實現的接口。 與其他語言(如PythonGo)不同,它沒有鴨子類型

有一個直觀的思考方式 - 你不是用一個演員來改變一個對象,你只是做了一個已經被允許的東西,如果知道了這個類型 - 換句話說,你只能轉換為你的對象的類型是。 因此,只需查看對象鏈“向上”以查看適用於您的對象的類型。

因此, 只有在鏈接中更高的位置定義接口時才可以轉換為接口(例如,如果您的類實現它,等等)。 它必須是顯式的 - 從你的問題來看,你可能會想到如果你實現方法“void foo()”那么你應該能夠轉換為定義方法“void foo()”的接口 - 這是有時被描述為“鴨子打字” (如果它像鴨子一樣嘎嘎叫,它是一只鴨子)但不是java的工作方式。

如果對象的運行時類型是您嘗試將其強制轉換為的子類型,則可以進行強制轉換。

編輯:

是的,您嘗試投射的對象需要實現該界面才能成功投射它。

如果:

interface MyInterface{}

class MyClass implements MyInterface{}

然后

MyClass m = new MyClass();
MyInterface i = (MyInterface)m;

是可能的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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