Java 編譯器似乎并不關心列表中的類型是否匹配,直到需要獲取對象為止:private static void print(List<Integer> list) { //private static <T> void print(List<T> list) { will also do for (Object object: list) System.out.print(object); int int0 = list.get(0); //ok //int int1 = list.get(1); //ClassCastException if run}public static void main(String[] args) { List list = new ArrayList(); list.add(1); list.add("2"); print(list);}
2 回答

滄海一幻覺
TA貢獻1824條經驗 獲得超5個贊
Java 編譯器沒有檢查您添加到列表中的元素的類型,因為您聲明了原始類型:
List?list?=?new?ArrayList();
然后在執行期間您嘗試分配String
給int
,這ClassCastException
在運行時引起。
您在這一行沒有遇到異常int int0 = list.get(0);
,因為自動裝箱(在本例中為拆箱)。
正是這類問題導致了Java 語言中引入泛型。因此,為了讓編譯器檢查放入列表的類型,您需要將聲明更改為:
List<Integer>?list?=?new?ArrayList<>();
這將告訴編譯器檢查添加到列表中的值的類型并強制它們為Integer
s。因此,基本上運行時錯誤將被消除并被編譯時錯誤取代。

收到一只叮咚
TA貢獻1821條經驗 獲得超5個贊
像這樣的類型化定義List<Integer>
正是為了防止此類錯誤。但是您沒有使用List list
任何類型,因此您拒絕在運行程序之前獲取有關編譯期間錯誤的信息。
聲明具有特定類型的列表
List<Integher> list = new ArrayList<>();
...Java編譯器會告訴你你的錯誤。您將看到以下行被標記為錯誤:
list.add("2");
添加回答
舉報
0/150
提交
取消