Java 从<;获取;?超级A>;

Java 从<;获取;?超级A>;,java,generics,super,Java,Generics,Super,泛型的整体思想是类型安全和防止类型转换 当我将()添加到的列表中时,如果您有一个类型为list的变量,您将该列表定义为的列表,什么是genB?genB应该是一个类型吗?为什么是小写?你为什么要选择一种似乎与任何事情都无关的类型?@user2357112很抱歉输入错误。修正了。我想你误解了“超级”是什么意思。您好,实际上,我无法将a的超类添加到此列表中。例如,我无法向其添加新对象()。这给了我一个捕捉错误。我只能将A及其子类添加到此列表中。因此,我应该能够将get中的变量类型标记为A,因为它只能是

泛型的整体思想是类型安全和防止类型转换


当我将()添加到
的列表中时,如果您有一个类型为
list的变量,您将该列表定义为
的列表,什么是
genB
genB
应该是一个类型吗?为什么是小写?你为什么要选择一种似乎与任何事情都无关的类型?@user2357112很抱歉输入错误。修正了。我想你误解了“超级”是什么意思。您好,实际上,我无法将a的超类添加到此列表中。例如,我无法向其添加新对象()。这给了我一个捕捉错误。我只能将A及其子类添加到此列表中。因此,我应该能够将get中的变量类型标记为A,因为它只能是A类型。这里有一个更深入的解释:嗯,似乎只有我能使用的东西。add()to
list
是A的子类,但是
list
本身可以指向A的超类。如果不奇怪的话,这是一个有趣的发现。@jforex78不能将
A
s添加到列表中并不意味着它只包含
Object
s。通配符的全部意义在于,使用通配符的代码调用方获得了更多的自由,而牺牲了实现者的自由(或者在某些情况下,以另一种方式)。请参阅:
void f(列表对不起,输入错误。应该是“仅仅因为您只能将
A
的子类型添加到列表中并不意味着它只包含
A
s。”
    ArrayList<? super A> list = new ArrayList<A>();

    Object obj = list.get(0);
List<Object> l = new ArrayList<>();
l.add(new Object());
List<? super A> l2 = l;