List <object>和List </object>之间的区别

时间:2014-07-02 08:30:59

标签: java list

这两行之间有什么区别:

List<Object> list = new ArrayList<Object>();

List list = new ArrayList();

据我所知,一切都是对象,当你只做List列表时,你刚才提到过。

8 个答案:

答案 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)

ListList<T>之间的差异为:

  1. List是原始类型,因此可以包含任何类型的对象,而List<T> 可能包含T类型或T子类型的对象。
  2. 我们可以将任何类型的列表对象分配给原始类型 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