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

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) 的類型是什么?
我的問題是:你為什么要使用原始類型?

TA貢獻1864條經驗 獲得超2個贊
因為當您使用原始類型(就像沒有任何泛型類型一樣)時,Java假定該列表中的元素類型是 。因此將返回類型的引用。正因為如此,你需要投擲。ArrayList
Object
list.get(0)
Object
返回的對象是類型,但對它的引用是類型,這就是為什么編譯器抱怨,因為您希望將類型的引用分配給基元類型的變量。list.get(0)
Integer
Object
Object
int

TA貢獻1827條經驗 獲得超9個贊
將訪問 List 中的元素,并在運行時發現它確實是一個整數。不過,它可能是其他任何東西。list.get(0).getClass().getName()
編譯器在編譯時知道的是,您的包含類型的項,請參閱 的簽名。所以它不能證明這永遠是正確的。您必須顯式投射。list
Object
List.get(int)
int value = list.get(0)
Java中的整個泛型只是編譯時。這是一種告訴編譯器如何將類型參數化類限制為僅特定類型的方法,從而在編譯時保證對它們的操作確實是正確的。也就是說,編譯器不允許您將 a 放入 .String
List<Integer>
在運行時,將擦除類型參數化信息。JVM 依靠編譯器完成生成正確代碼的工作來運行。在運行時沒有任何東西可以讓JVM知道a的內容是什么類型; 具有任何類參數的單個實現。(這與 C# 或 C++ 不同。List
ArrayList
添加回答
舉報