亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 java 編譯器在獲取列表參數之前不檢查對象類型?

為什么 java 編譯器在獲取列表參數之前不檢查對象類型?

慕勒3428872 2023-07-28 16:05:14
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();

然后在執行期間您嘗試分配Stringint,這ClassCastException在運行時引起。

您在這一行沒有遇到異常int int0 = list.get(0);,因為自動裝箱(在本例中為拆箱)。

正是這類問題導致了Java 語言中引入泛型。因此,為了讓編譯器檢查放入列表的類型,您需要將聲明更改為:

List<Integer>?list?=?new?ArrayList<>();

這將告訴編譯器檢查添加到列表中的值的類型并強制它們為Integers。因此,基本上運行時錯誤將被消除并被編譯時錯誤取代。



查看完整回答
反對 回復 2023-07-28
?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

像這樣的類型化定義List<Integer>正是為了防止此類錯誤。但是您沒有使用List list任何類型,因此您拒絕在運行程序之前獲取有關編譯期間錯誤的信息。

聲明具有特定類型的列表

List<Integher> list = new ArrayList<>();

...Java編譯器會告訴你你的錯誤。您將看到以下行被標記為錯誤:

list.add("2");


查看完整回答
反對 回復 2023-07-28
  • 2 回答
  • 0 關注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號