為什么說(shuō)List 不隸屬于List
在 Java 中,泛型是不可協(xié)變的,這意味著 List<String>
并不是 List<Object>
的子類型。這樣的設(shè)計(jì)是為了保護(hù)你免受無(wú)意引入錯(cuò)誤的危險(xiǎn)。
假設(shè) Java 允許這樣的協(xié)變,那么你可能會(huì)遇到以下情況:
javaCopy code
List<String> stringList =?new?ArrayList<>(); List<Object> objectList = stringList;?// 假設(shè)這是合法的?objectList.add(new?Object());?// 這將在運(yùn)行時(shí)出錯(cuò),因?yàn)槟阍噲D在 String 類型的列表中添加一個(gè) Object 類型的元素?String?s?=?stringList.get(0);?// 類型錯(cuò)誤
在這個(gè)例子中,如果 Java 允許 List<String>
是 List<Object>
的子類型,那么你就可以將一個(gè) Object
類型的元素添加到 String
類型的列表中,這在運(yùn)行時(shí)將導(dǎo)致錯(cuò)誤。為了避免這種情況,Java 的泛型設(shè)計(jì)為不可協(xié)變。
但是,Java 提供了一種方式來(lái)創(chuàng)建一個(gè)只讀的 List<Object>
,這樣就可以接受 List<String>
了。你可以使用通配符來(lái)創(chuàng)建一個(gè)只讀的 List<Object>
:
javaCopy code
List<String> stringList =?new?ArrayList<>(); List<?> objectList = stringList;?// 這是合法的
在這種情況下,objectList
是只讀的,你不能向其添加任何類型的對(duì)象。這種方式提供了某種形式的協(xié)變性,同時(shí)也避免了類型錯(cuò)誤。