![](/img/trans.png)
[英]What is the difference between List<Object[]> and List<Object>?
[英]Difference between List<Object> and List
这几行有什么区别:
List<Object> list = new ArrayList<Object>();
和
List list = new ArrayList();
据我了解,一切都是对象,当您只列出列表时,您刚刚提到了这一点。
最终这两种说法都是一样的。 在这种情况下没有区别,因为 java 中的每个类都扩展了 Object。
如果您使用Object
以外的任何特定对象,您会看到不同之处。
例如:
List<String> vs List
实际上没有区别,它们都编译成完全相同的代码。
List<Object>
虽然表明您已经考虑过列表中将包含的内容并且知道它可以是任何内容,而List
本身却没有显示任何内容。
Java 一直非常擅长保持其版本之间的向后兼容性。 有人会说,太好了;)
添加泛型后,Sun 付出了很多努力,使以前版本的 Java 以相同的方式工作。 他们还确保泛型是 Java 编译器的一部分,而不是 JVM。 所以一些奇怪的东西显示出来了,这就是其中之一。
结果是两者实际上是相同的。 一切都以 Java 语言版本的向后兼容性为名。
虽然您不会看到List
/ ArrayList
本身的行为方式有什么不同,但原始类型的使用可能会影响程序的其他区域,因为所有涉及相关代码的通用检查都会被跳过。
以这个问题为例。 从接受的答案:
public class Test {
public static void main(String[] args) {
String s;
// this compiles
s = new Generic<Object>().get();
// so does this
s = new Generic<Object>().<String>get();
// this doesn't compile
s = new Generic().get();
// neither does this
s = new Generic().<String>get();
}
}
class Generic<A> {
<B> B get() { return null; }
}
请注意,当类Generic
使用<Object>
参数化时,您可以很好地编译代码,但是当您使用原始类型时,在Generic
声明的不相关的泛型类型B
也会被删除,从而导致编译时错误,因为Object
可以' t 分配给String
。
所以是有区别的-使用原始类型时,你没有得到任何检查。 如果使用<Object>
,编译器仍将在代码的其他部分执行类型检查。
只有傻瓜的区别。 使用List<Object>
和非泛型List
是愚蠢的,因为你打算用它做什么?
通常,您使用List
对相关项进行分组,然后以某种方式遍历它们并执行一些常见操作或为每个项提取一些常见信息。
这至少有一定的意义:
List<Car> cars = getMeTheCars();
for(Car c : cars) {
System.out.println(c.getName() + " is a car.");
}
如果你的列表中有一堆不同的、不相关的类型,你会得到这样的可怕的东西:
List<Object> obs = getMeTheObjects();
for(Object o : obs) {
if(o instanceof String) { ... }
if(o instanceof DateTime) { ... }
if(o instanceof Integer) { ... }
if(o instanceof Double) { ... }
if(o instanceof Decimal) { ... }
if(o instanceof SomeWeirdCustomClass) { ... }
if(o instanceof SomeOtherClass) { ... }
}
基本上只有类型不同。 当您使用 List Object 时,您使用的是 Object 类型(在本例中)。 当您不说列表将默认为 RAW 类型时。 希望这可以帮助。
List
是Rawtype是不完全一样的东西List<Object>
正如已经提到的List
是 Java 遗留代码,并且由于向后兼容性是 Java 中的一个主要问题,因此仍然允许使用诸如List
之类的原始类型,而List<Object>
是一个对象列表。 如果您在两个对象上使用List
类方法,您会注意到它们的行为方式相同,没有区别。 但是如果你尝试在 JDK 8+ 中做这样的事情,例如:
List<Object> objects = new ArrayList<>();
List<String> strings = objects; //Compilation error
你会得到一个编译器错误,而下面的代码工作正常:
List raws = new ArrayList();
List<String> string = raws; // No compilation errors
例如,第二个示例适用于维护使用List
的遗留代码的人。 他们可以影响它到具体的类并使用它们而不是继续使用 Rawtype 类。
来自 java 文档:
为了方便与非通用遗留代码的接口,可以将参数化类型(第 4.5 节)的擦除(第 4.6 节)或元素类型为参数化类型的数组类型(第 10.1 节)的擦除用作类型. 这种类型称为原始类型。
List
和List<T>
之间的区别是:
List
是原始类型,因此可以包含任何类型的对象,而List<T>
可以包含类型 T 或 T 的子类型的对象。List
引用变量,而我们只能将<T>
类型的列表对象分配给List<T>
类型的引用变量。例如: List list=new ArrayList(); //works fine
List<String> list1=new ArrayList(); //works fine
List<Animal> animals=new ArrayList<Animal>(); //works fine
List<Animal> dogs=new ArrayList<Dog>(); // compile-time error
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.