3 回答

TA貢獻1803條經驗 獲得超3個贊
這是可能的,因為 Java 中的類型擦除。簡而言之,這意味著在運行時 Java 不知道您的泛型類型,因此任何List對象都使用Object類型進行操作。泛型具有編譯類型安全性。但是您可以更詳細地了解類型擦除,例如這里。
您可以自己模仿的相同行為:
public static void main(String[] args) {
List<String> list = new ArrayList<>();
addToList(list);
System.out.println(list);
}
private static void addToList(List list) {
list.add(1L);
list.add(42);
list.add("String");
list.add(new Runnable() {
@Override
public void run() {}
});
}
只要您不嘗試將列表條目作為字符串進行操作,此代碼就可以正常工作。但是當你添加如下內容時:
for (String s : list) {
System.out.println(s);
}
你會得到java.lang.ClassCastException。
因此,在編譯時,您可以使用List<String>,但在運行時,Java 只知道List.

TA貢獻1794條經驗 獲得超8個贊
是的,你可以,這是一個小例子
public static void main(String args) {
List objects = new ArrayList();
objects.add("string");
objects.add(1L);
List<String> onlyStrings = objects;
}
如果您愿意,您可以將非通用列表轉換為 List(您會收到一堆編譯器警告)。

TA貢獻1865條經驗 獲得超7個贊
考慮以下示例:
public static void main(String[] args) {
List a = new ArrayList();
a.add("a");
a.add(1L);
List<String> b = new ArrayList(a);
System.out.println(b);
}
這輸出
[a, 1]
以上是合法的,因為java執行類型擦除,從而在運行時丟棄元素類型信息。這意味著每個 List 本質上都是一個 List 并且可以包含多個類實例。
public interface List<E> extends Collection<E>
轉換為
public interface List extends Collection
在編譯時。
如果 E 被綁定,即 E 擴展了 MyClass,它將被轉換為 MyClass。
在您的情況下,您正在為每一行實例化一個地圖,沒有類型界限,您正在對其進行平面映射,然后將其收集到一個列表中,這實際上與我的示例相同,因此是合法的。
添加回答
舉報