2016-01-27 18 views
5

爲什麼A的實例可以轉換爲List但不能轉換爲String?Java海關類實例不能強制轉換爲String。爲什麼?

class A{} 
... 
A a = new A(); 
List list = (List)a; //pass 
String s = (String)a; //compile error 
+5

因爲...這不是一個字符串。 –

+1

添加到Andy的答案List是一個接口,而String是類。如果你調用列表中的方法,那麼它會拋出錯誤 –

+0

但它不是一個列表... –

回答

6

根據規範,編譯器在對轉換進行這些檢查時僅考慮聲明類型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總是失敗。

當然,在演習中,演員陣容在實踐中會失敗。但不是在編譯時。

7

引用JLS

它是一個編譯時間錯誤,如果,對於任何兩個類(不接口)Vi和Vj的Vi是不VJ的一個子類,或反之亦然。

StringA是不相關的類,所以它是一個編譯時錯誤。 List是一個接口,所以不會導致相同的錯誤。

請注意,您的說法

A的實例可以施展列出

是不太正確的:A無法被轉換爲List;這只是一個運行時間故障,而不是編譯時間故障。

+0

嘿@ShadowDroid - 我拒絕了你的編輯,因爲我不想爲你的見解記下功勞。隨意發表評論,或者作爲答案提交,我會很高興地爲它提供支持。 –

+0

我沒有幫助獲得信用/投票。我只是想分享知識。反正@Erwin貼出了一個很好的詳細樣本答案。 –

1

Java中的類只能轉換爲其超類型之一,或者其超類型之一的接口之一。

對您而言,A類不是String的子類。因此A不能轉換爲String。另外,String是最後一個階級,因此您無法編寫可投射到String的類A

Java已經認識到需要輕鬆地將類顯示爲字符串,特別是爲了調試/日誌記錄的目的。爲了滿足這種需求,Object類帶有toString()方法。由於所有Java類都從Object類擴展而來,所有Java類都包含toString()方法的實現。

要記住,toString()方法的存在並不意味着A是一個字符串是很重要的,而這意味着你可以從A一個字符串,有些描述A實例。如果您發現缺少爲您的目的所提供的描述,您可以覆蓋AtoString()方法的作爲替代是用Java編寫返回一個更好的描述,像這樣

@Override 
public String toString() { 
    return "my better description"; 
} 

,您還可以包括任何變量或其他項目,你最終可以變成一個字符串(因爲所有的對象都有toString()幾乎包括任何東西)。

相關問題