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

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

原始類型在Java中是如何工作的?

原始類型在Java中是如何工作的?

米脂 2022-09-07 20:54:51
我正在學習泛型,我有一個誤解。例如,我有這個簡單的代碼:import java.util.ArrayList;public class DemoApp {    public static void main(String[] args) {        ArrayList list = new ArrayList();        list.add(1);        System.out.println(list.get(0).getClass().getName());         int value = (Integer) list.get(0);    }}我不明白為什么我應該投向,因為這個陳述有這個結果?list.get(0)IntegerSystem.out.println(list.get(0).getClass().getName());java.lang.Integer如果我使用此語句,則會出現此錯誤:...而我真的不明白,是一個還是一個?int value = list.get(0);Type mismatch: cannot convert from Object to intlist.get(0)ObjectInteger
查看完整描述

4 回答

?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

ArrayList原始類型。它的行為類似于 .您可以向其添加對象的所有子類型(這幾乎是全部)。ArrayList<Object>


因此,如果您從列表中取回一個對象,那么它是一個 - 在編譯時,您無法知道它是一個還是.ObjectIntegerString


使用 .ArrayList<Integer>


編輯:


import java.util.ArrayList;


public class DemoApp {


    public static void main(String[] args) {

        ArrayList list = new ArrayList();

        list.add(1); // an int

        list.add("Test"); // an String

        list.add(new Object()); // and empty


        var rnd = RandomUtils.random(list.size());


        for (Object value : list)      

           System.out.println(value.getClass().getName()); 



       list.get(rnd) // so, what is the type of the object?

       // the compiler cannot know it (compile-time), you need to run the program and check it (runtime)


    }

}

編輯2:另見 https://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html


查看完整回答
反對 回復 2022-09-07
?
慕田峪7331174

TA貢獻1828條經驗 獲得超13個贊

Plain ArrayList 表示 ,表示包含未指定類型的對象的 ArrayList。由于所有對象都派生自 Object,因此關于這些對象的最好選擇是它們是 Objects。ArrayList<?>


在運行時,特定對象也可能變成整數(以及),這一事實并不能消除在編譯時對象類型未知的問題。


考慮:


list.add(1);

list.add("two");

for (int i=0; i<list.size(); i++)

    System.out.println(list.get(i).getClass().getName()); 

現在 list.get(i) 的類型是什么?


我的問題是:你為什么要使用原始類型?


查看完整回答
反對 回復 2022-09-07
?
慕斯王

TA貢獻1864條經驗 獲得超2個贊

因為當您使用原始類型(就像沒有任何泛型類型一樣)時,Java假定該列表中的元素類型是 。因此將返回類型的引用。正因為如此,你需要投擲。ArrayListObjectlist.get(0)Object

返回的對象是類型,但對它的引用是類型,這就是為什么編譯器抱怨,因為您希望將類型的引用分配給基元類型的變量。list.get(0)IntegerObjectObjectint


查看完整回答
反對 回復 2022-09-07
?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊

將訪問 List 中的元素,并在運行時發現它確實是一個整數。不過,它可能是其他任何東西。list.get(0).getClass().getName()

編譯器在編譯時知道的是,您的包含類型的項,請參閱 的簽名。所以它不能證明這永遠是正確的。您必須顯式投射。listObjectList.get(int)int value = list.get(0)

Java中的整個泛型只是編譯時。這是一種告訴編譯器如何將類型參數化類限制為僅特定類型的方法,從而在編譯時保證對它們的操作確實是正確的。也就是說,編譯器不允許您將 a 放入 .StringList<Integer>

在運行時,將擦除類型參數化信息。JVM 依靠編譯器完成生成正確代碼的工作來運行。在運行時沒有任何東西可以讓JVM知道a的內容是什么類型; 具有任何類參數的單個實現。(這與 C# 或 C++ 不同。ListArrayList


查看完整回答
反對 回復 2022-09-07
  • 4 回答
  • 0 關注
  • 163 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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