4 回答
TA贡献1827条经验 获得超7个赞
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
添加回答
举报