1

我正在理解 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 {
    }
}
4

3 回答 3

3

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

在第二种情况下,ArrayList<A>extends List<A>,所以 aList<List<A>>也可以包含 的实例ArrayList<A>。这不会像第一种情况那样给出错误的原因A是实际上并没有创建一个实例,所以没关系。

于 2013-05-12T01:53:49.720 回答
1

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

于 2013-05-12T02:21:43.417 回答
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()); // 为什么上面的行没有抛出错误?

它不抛出错误的原因是该语句有效。您正在添加ArrayList您创建的列表的 A (在插槽中)。

希望这可以帮助。

于 2013-05-12T02:08:53.813 回答