当有一个通用的List<Object>
时,我已经在一些框架和工具中看到了它。创建List
的类型为Object
的重点是什么?它是否过时或背后有原因?
修改
是的,IDE可能会显示警告,但您可以添加SuppressWarning
,因为在我认为使用泛型Object
类型
答案 0 :(得分:2)
如果您使用泛型类而未指定泛型类型参数(例如List l
),则某些IDE和代码检查器会显示警告。
通过添加<Object>
,您表明此列表旨在存储对象,并且您不会忘记添加泛型类型参数。
如果您必须使用不支持的旧(Java 1.5之前)代码,这也很有帮助
仿制药。如果在这种情况下看到List l
,您永远无法确定它是旧代码(在存在泛型之前编写),还是集合实际存储了Object
类型的项目。
答案 1 :(得分:1)
类型参数不是可选的:List
是一种与List<Object>
完全不同的类型。
Java中存在原始类型的唯一原因是遗留代码。您永远不应该编写引入新原始类型的代码。
List
和List<Object>
之间的差异变得至关重要的一个重要案例如下:
static void addObject(List<Object> objs) { objs.add("a"); }
static void addObjectToRaw(List objs) { objs.add("a"); }
public static void main(String[] args) {
final List<Boolean> bools = new ArrayList<>();
addObject(bools); // compiler detects error
addObjectToRaw(bools); // compiler is silent
}
接受原始List
作为参数具有消除所有类型安全的效果。
答案 2 :(得分:-1)
这样做实际上是你可以在其中存储任何对象。
List<Object> objects = new ArrayList<Object>();
objects.add(1);
objects.add("Toto");
objects.add(12.2f);
for(Object o : objects){
System.out.println(o);
}
将打印: 1 托托 12.2
这就是差异
List<Object> list1 = new ArrayList<Object>();
List<?> list2 = new ArrayList<String>();Now, let's try the code below:
list1.add("");// this works fine
list2.add("");// this one issues a compile error