簡體   English   中英

Java explicit casting on list.get(0) (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)的引用分配給sString類型的變量)。

最后一行的轉換表明 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包含任何Objectlist.get(0); 只能知道它正在返回一個Object並且不知道 0 處的元素實際上是一個String 由於它不知道它確實是一個String ,因此編譯器會警告您正在執行從ObjectString的未經檢查的強制轉換。

list.get(0) instanceof String返回 true 因為它是運行時檢查 0 處的元素實際上是String

暫無
暫無

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

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