这两行之间有什么区别:
List<Object> list = new ArrayList<Object>();
和
List list = new ArrayList();
据我所知,一切都是对象,当你只做List列表时,你刚才提到过。
答案 0 :(得分:6)
最终两个陈述都是一样的。在这种情况下没有区别,因为java中的每个类都扩展了Object。
如果你选择Object
以外的任何特定对象,你会发现不同之处。
例如:
List<String> vs List
答案 1 :(得分:6)
实际上没有区别,它们都编译成完全相同的代码。
List<Object>
虽然表明您已经考虑了列表中的内容并知道它可能是任何内容,而List
本身没有显示任何内容。
答案 2 :(得分:3)
Java一直非常善于保持其版本之间的向后兼容性。有人会说,太好了;)
当添加Generics时,Sun投入了大量精力来使以前版本的Java以相同的方式工作。他们还确保Generics是Java编译器的一部分,而不是JVM。所以有一些奇怪的东西显示出来,这就是其中之一。
结果是两者实际上是相同的。所有这些都以Java语言版本的向后兼容性为名。
答案 3 :(得分:1)
虽然List
/ ArrayList
本身的行为方式不会有所不同,但原始类型的使用会影响程序的其他区域,如所有涉及相关代码的通用检查都会被跳过。
以this个问题为例。从接受的答案:
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>
进行参数化时,您可以很好地编译代码,但是当您使用原始类型时无关泛型类型{{ 1}}在 B
内声明的 也已擦除,从而导致编译时错误,因为Generic
无法分配给Object
}。
所以是的区别 - 当使用原始类型时,你不会得到任何检查。如果使用String
,编译器仍会在代码的其他部分执行类型检查。
答案 4 :(得分:1)
只有傻瓜的区别。使用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) { ... }
}
答案 5 :(得分:0)
基本上只有类型不同。使用列表对象时,您使用的是对象类型(在本例中)。当你不说列表将默认为RAW类型。希望这会有所帮助。
答案 6 :(得分:0)
List<Object>
是Rawtype与List
并不完全相同。如前所述,List
是Java传统代码,并且由于向后兼容性是Java中的主要问题,因此仍允许使用List<Object>
之类的Rawtype,而List
是对象列表。如果您在两个对象上都使用List<Object> objects = new ArrayList<>();
List<String> strings = objects; //Compilation error
类方法,则会发现它们的行为相同,没有区别。但是,例如,如果您尝试在JDK 8+中执行以下操作:
List raws = new ArrayList();
List<String> string = raws; // No compilation errors
您将得到一个编译器错误,而以下代码则工作正常:
List
第二个示例起作用的原因是例如维护使用resize
的旧代码的人员。他们可以影响它来具体化类并与其一起工作,而不是继续使用Rawtype类。
来自Java docs:
为便于与非通用遗留代码接口,可以 将类型化的参数(第4.5节)的擦除(第4.6节)用作类型,或 删除元素类型为a的数组类型(第10.1节) 参数化类型。这样的类型称为原始类型。
答案 7 :(得分:0)
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