2017-08-26 52 views
-6

泛型的整个想法是类型安全和防止演员。获取从<? super A>

当我添加()到<? super A>的列表时,它让我编译get的唯一方法是将变量类型声明为Object。

ArrayList<? super A> list = new ArrayList<A>(); 

    Object obj = list.get(0); 

事实是,我只能将A和A的子类添加到此列表中。

所以一个,为什么它不让我声明OBJ为A型?

A obj = list.get(0);

和两个,事实上,类型现在是Object,似乎放松了整个仿制药的想法 - 我正在含有它的伞型,我需要转换.get()

+0

什么是'genB'列表? – user2357112

+0

'genB'应该是一个类型吗?为什么它是小写字母?你为什么选择某种类型的东西似乎与任何事情没有关系? – user2357112

+0

@ user2357112对于输入错误感到抱歉。固定。 – jforex78

回答

1

如果您有类型List<? super A>的变量,则只能通过该变量将A类型的值添加到。这并不意味着它不能在它的其他对象:

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

l2.add只能用A类型的值调用,但l2.get可以返回非A实例。

2

您将该列表定义为列表<? super A>,这意味着该列表包含的元素为A或其任何超类,这会导致问题,因为可以有任意数量的超类,它们可以一路最多为object,所以编译器可以保证的是,从列表返回的项目是一个对象。

如果你想有一个包含A是你应该把它定义为一个List<A>其guarentees名单将只包含A S或A的子类

+0

嗨,实际上,我无法将A的超类添加到此列表中。例如,我不能添加一个新的Object()。它给我一个捕获#1错误。我只能将A及其子类添加到此列表中。所以,我应该能够将变量类型从dec获取为A,因为它只能是A类型。 – jforex78

+0

更深入的解释可以在这里获得: https://stackoverflow.com/a/4343547/8041461 – jrtapsell

+0

嗯。看来只使用我可以.add()到'list'的东西是A的子类,但是'list'本身可以指向A的超类。如果不奇怪,它是一个有趣的发现。 – jforex78