[英]incompatible types: java.lang.Object cannot be converted to java.lang.String
[英]Java explicit casting on list.get(0) (incompatible types: java.lang.Object cannot be converted to java.lang.String)
The following code is mentioned in the Java Tutorials:-( https://docs.oracle.com/javase/tutorial/java/generics/why.html )
List list = new ArrayList();
list.add("hello");
String s = (String) list.get(0);
最后一行的轉換表明 list.get(0) 不返回字符串。 現在,由於列表沒有用任何數據類型聲明,它可以接受任何 object。 所以我假設 list.get(0) 返回一個 Object 類型。
但是當我檢查list.get(0) instanceof String
--> 它返回 true。
那么為什么需要顯式轉換。 請解釋。
所以我假設 list.get(0) 返回一個 Object 類型。
是的,它確實。
但是當我檢查 list.get(0) instanceof String --> 它返回 true。
是的,它應該返回true ,因為list
索引0
處的項目是String
。
那么為什么需要顯式轉換。
它是必需的,因為列表包含Object
s,並不是列表中的每個Object
都保證是String
。 顯式轉換是必需的,以便您可以將list.get(0)
的引用分配給s
( String
類型的變量)。
最后一行的轉換表明 list.get(0) 不返回字符串。
這是不准確的。 如果返回的 object不是String
,則無法進行強制轉換。 換句話說,您只能將某些東西轉換為String
如果該東西是String
。 嘗試投射其他東西,你會看到:
Object i = Integer.valueOf(5);
String j = (String)i; //Exception!
您的代碼中需要強制轉換,因為list.get(0)
返回Object
類型,但我們想將其分配給String s
。 作為程序員,我們知道從列表返回的Object
實際上是String
,但編譯器不是。 編譯器只看到這個:
Object l = list.get(0);
String s = l;
如果沒有顯式轉換為String
,第二行將無法編譯。
只是為了澄清......你永遠不會在現實世界中看到這樣的代碼,除非你正在處理一些非常古老的東西。 Java 自 Java 5 (2004) 以來具有 generics,所以現在已經 15 年了。 在這一點上,你真的不應該看到沒有List
List<SomeType>
的 List (例如List<String>
)
List list = new ArrayList();
是一個未參數化的類型(你想避免),這意味着它可以采用任何Object
。
由於您的list
包含任何Object
, list.get(0);
只能知道它正在返回一個Object
並且不知道 0 處的元素實際上是一個String
。 由於它不知道它確實是一個String
,因此編譯器會警告您正在執行從Object
到String
的未經檢查的強制轉換。
list.get(0) instanceof String
返回 true 因為它是運行時檢查 0 處的元素實際上是String
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.