繁体   English   中英

列表之间的区别<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 节)的擦除用作类型. 这种类型称为原始类型。

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

列表,列表之间的区别<!--?--> , 列表<t> , 列表<e> , 和列表<object><div id="text_translate"><p> <strong>List 、 List<?> 、 List<T> 、 List<E>和List<Object>之间有什么区别?</strong></p><h1> 1.清单</h1><p> List :是原始类型,因此不是typesafe的。 它只会在转换错误时产生运行时错误。 当转换错误时,我们希望出现编译时错误。 不推荐使用。</p><h1> 2.列表<?></h1><p> List<?>是一个无限通配符。 但我不确定它的用途是什么? 我可以毫无问题地打印一个List<?> :</p><pre> public static void test(List<?> list){ System.out.println(list); // Works }</pre><p> <strong>为什么我不能将项目添加到List<?> ?</strong></p><pre> public static void test(List<?> list){ list.add(new Long(2)); // Error list.add("2"); // Error System.out.println(list); }</pre><h1> 3.列表<T></h1><pre> public static void test(List<T> list){ // T cannot be resolved System.out.println(list); }</pre><p> 我不明白这种语法。 我看到了这样的东西,它有效:</p><pre> public <T> T[] toArray(T[] a){ return a; }</pre><p> <strong>有时,我会看到<T>或<E>或<U> 、 <T,E> 。</strong> <strong>它们都是一样的还是代表不同的东西?</strong></p><h1> 4. 列表<对象></h1><p> 这给出了错误“方法test(List<Object>)不适用于参数List<String> ”:</p><pre> public static void test(List<Object> list){ System.out.println(list); }</pre><p> 如果我尝试这个然后我得到“无法从List<String>投射到List<Object> ”:</p><pre> test((List<Object>) names);</pre><p> 我很迷惑。 <strong>String是Object的子类,那么为什么List<String>不是 List List<Object>的子类?</strong></p></div></object></e></t>

[英]Difference between List, List<?>, List<T>, List<E>, and List<Object>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 List和有什么不一样 <Object[]> 和清单 <Object> ? 列表,列表之间的区别<!--?--> , 列表<t> , 列表<e> , 和列表<object><div id="text_translate"><p> <strong>List 、 List<?> 、 List<T> 、 List<E>和List<Object>之间有什么区别?</strong></p><h1> 1.清单</h1><p> List :是原始类型,因此不是typesafe的。 它只会在转换错误时产生运行时错误。 当转换错误时,我们希望出现编译时错误。 不推荐使用。</p><h1> 2.列表<?></h1><p> List<?>是一个无限通配符。 但我不确定它的用途是什么? 我可以毫无问题地打印一个List<?> :</p><pre> public static void test(List<?> list){ System.out.println(list); // Works }</pre><p> <strong>为什么我不能将项目添加到List<?> ?</strong></p><pre> public static void test(List<?> list){ list.add(new Long(2)); // Error list.add("2"); // Error System.out.println(list); }</pre><h1> 3.列表<T></h1><pre> public static void test(List<T> list){ // T cannot be resolved System.out.println(list); }</pre><p> 我不明白这种语法。 我看到了这样的东西,它有效:</p><pre> public <T> T[] toArray(T[] a){ return a; }</pre><p> <strong>有时,我会看到<T>或<E>或<U> 、 <T,E> 。</strong> <strong>它们都是一样的还是代表不同的东西?</strong></p><h1> 4. 列表<对象></h1><p> 这给出了错误“方法test(List<Object>)不适用于参数List<String> ”:</p><pre> public static void test(List<Object> list){ System.out.println(list); }</pre><p> 如果我尝试这个然后我得到“无法从List<String>投射到List<Object> ”:</p><pre> test((List<Object>) names);</pre><p> 我很迷惑。 <strong>String是Object的子类,那么为什么List<String>不是 List List<Object>的子类?</strong></p></div></object></e></t> List <Object>和List <?>之间有什么区别 List和List之间的Java差异<Object> List和Enumeration之间的区别 清单项目之间的差异 List和Array之间的区别 我应该如何获得2个清单之间的区别<Object> Groovy-List、ArrayList 和 Object Array 的区别 Query .list和.getResultList之间的区别
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM