[英]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
。
有一個直觀的思考方式 - 你不是用一個演員來改變一個對象,你只是做了一個已經被允許的東西,如果知道了這個類型 - 換句話說,你只能轉換為你的對象的類型是。 因此,只需查看對象鏈“向上”以查看適用於您的對象的類型。
因此, 只有在鏈接中更高的位置定義接口時才可以轉換為接口(例如,如果您的類實現它,等等)。 它必須是顯式的 - 從你的問題來看,你可能會想到如果你實現方法“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.