爲什麼A的實例可以轉換爲List但不能轉換爲String?Java海關類實例不能強制轉換爲String。爲什麼?
class A{}
...
A a = new A();
List list = (List)a; //pass
String s = (String)a; //compile error
爲什麼A的實例可以轉換爲List但不能轉換爲String?Java海關類實例不能強制轉換爲String。爲什麼?
class A{}
...
A a = new A();
List list = (List)a; //pass
String s = (String)a; //compile error
根據規範,編譯器在對轉換進行這些檢查時僅考慮聲明類型a
。
所以,你寫的:
A a = new A();
但是,編譯器只考慮
A a; // = <something>;
所以它知道a
不能爲String
,因爲一個類只能有一個父類(多重繼承),不能有類A
的子類也是一個字符串。
但是,對於接口,這是不正確的。因此,儘管我們知道,類A
沒有實現List
,有可能是這樣定義的類B
:
class B extends A implements List {}
而且因爲編譯器只考慮聲明的類型,它必須假定它也可以在你分配new B()
至a
。
因此,因爲A
的子類可以實現接口List
,所以編譯器無法假定轉換爲List
總是失敗。
當然,在演習中,演員陣容在實踐中會失敗。但不是在編譯時。
引用JLS:
它是一個編譯時間錯誤,如果,對於任何兩個類(不接口)Vi和Vj的Vi是不VJ的一個子類,或反之亦然。
String
和A
是不相關的類,所以它是一個編譯時錯誤。 List
是一個接口,所以不會導致相同的錯誤。
請注意,您的說法
A的實例可以施展列出
是不太正確的:A
無法被轉換爲List
;這只是一個運行時間故障,而不是編譯時間故障。
嘿@ShadowDroid - 我拒絕了你的編輯,因爲我不想爲你的見解記下功勞。隨意發表評論,或者作爲答案提交,我會很高興地爲它提供支持。 –
我沒有幫助獲得信用/投票。我只是想分享知識。反正@Erwin貼出了一個很好的詳細樣本答案。 –
Java中的類只能轉換爲其超類型之一,或者其超類型之一的接口之一。
對您而言,A
類不是String
的子類。因此A
不能轉換爲String
。另外,String
是最後一個階級,因此您無法編寫可投射到String
的類A
。
Java已經認識到需要輕鬆地將類顯示爲字符串,特別是爲了調試/日誌記錄的目的。爲了滿足這種需求,Object
類帶有toString()
方法。由於所有Java類都從Object
類擴展而來,所有Java類都包含toString()
方法的實現。
要記住,toString()
方法的存在並不意味着A
是一個字符串是很重要的,而這意味着你可以從A
一個字符串,有些描述A
實例。如果您發現缺少爲您的目的所提供的描述,您可以覆蓋A
的toString()
方法的作爲替代是用Java編寫返回一個更好的描述,像這樣
@Override
public String toString() {
return "my better description";
}
,您還可以包括任何變量或其他項目,你最終可以變成一個字符串(因爲所有的對象都有toString()
幾乎包括任何東西)。
因爲...這不是一個字符串。 –
添加到Andy的答案List是一個接口,而String是類。如果你調用列表中的方法,那麼它會拋出錯誤 –
但它不是一個列表... –