2013-05-12 69 views
1

我正在理解Java中泛型的概念。我无法理解以下几行代码。了解Java中列表的列表

import java.util.List; 
import java.util.ArrayList; 


public final class Main { 
    public static final void main(final String[] args) { 
     final List<A> listA = new ArrayList<Main.A>(); 
     //listA.add(new Main.B()); // i understood why this line is an error. 

     final List<List<A>> listListA = new ArrayList<List<A>>(); 
     listListA.add(new ArrayList<Main.A>()); 
     // Why the above line doesn't throws an error ? 
    } 

    private class A { 
    } 


    private final class B extends A { 
    } 
} 
+0

您是指编译器错误或运行时错误? – OldProgrammer 2013-05-12 01:52:11

+0

编译时错误 – 2013-05-12 01:54:04

+0

代码编译。没有错误。 http://ideone.com/YetaPJ – 2013-05-12 01:55:28

回答

3

在第一种情况下,listA.add(new Main.B()),因为B是一个非静态内部类,它必须持有this参考外部类这给编译错误。因此,实例化B需要外部类中的非静态上下文,所以它不能在静态方法中实例化。

在第二种情况下,ArrayList<A>延伸List<A>,所以List<List<A>>还可以含有的ArrayList<A>实例。这不会像第一种情况那样给出错误的原因是A的实例实际上并未创建,所以这没问题。

+3

@RaviTrivedi只有具有私有构造函数的类不能被实例化。可以启动私有构造函数以外的私人类.. – 2013-05-12 02:27:45

+0

感叹。 @Ravi,看,当OP说有错误时,如果我没有编译代码并自己测试,我不会声称没有错误。它编译,运行并成功,没有错误。 – javic 2013-05-12 02:29:46

+0

啊,我明白了。你说了一点。但是,这不是因为该类是私有的,您不能实例化它。我正在更新我的答案以反映原因。 – javic 2013-05-12 02:40:37

1

让我们来谈谈。

在这一行,final List<A> listA = new ArrayList<Main.A>(),它创建了一个ArrayList来保存这种类型A.思考的对象为其中每个槽容纳A.

在该线的阵列,final List<List<A>> listListA = new ArrayList<List<A>>()还创建ArrayList但在这种情况下每个插槽都有一个列表A

listListA.add(new ArrayList()); //为什么上面的行不会引发错误?

它不会抛出错误的原因是因为声明是有效的。您正在添加您创建的列表中的A(在一个插槽中)的ArrayList

希望这会有所帮助。

1

代码编译良好,没有任何错误。此行listListA.add(new ArrayList<Main.A>());不会引发错误,因为它是有效的Java语句。