Java泛型参数与继承

Java generic parameters and inheritance

假设我们知道视图组扩展了视图。此外,我们还有一个通用的、参数化的class A

问题:为什么不把C.add()作为参数来接受new A()?因为多态性,它不应该工作吗?

Class diagram

解决方案:singning add with ? extends View让add接受new A()作为参数。

Solution


您签署的add方法为:

1
static void add(A<View>)

但你可能是说:

1
static void add(A<? extends View> a)


首先,您所说的视图扩展了视图组,但图表显示视图组扩展了视图(我认为这是正确的)。

第二,不允许您将List作为List通过。这是一个编译时保护,防止有人将另一个视图添加到此列表中,并危害泛型的类型安全。

List不是List的亚型,而是List的亚型。因此,您可以修改您的方法来接受一个List,但是要注意,您不能添加到以这种方式传递给方法的列表中。

还有另一种称为下界通配符(List的语法),与上面提到的上界通配符不同,它允许您添加到列表中,但可以在视图组或其父级列表中进行olny传递。

有关泛型中通配符的详细信息,请访问:http://download.oracle.com/javase/tutorial/java/generics/widcards.html


首先,您的问题不太清楚,因为UML图与您的文本相矛盾。您说视图扩展了视图组,但图表显示的是相反的情况:视图组扩展了视图。

现在,一个List并没有扩展一个List。如果是这样,你可以:

1
2
3
4
List<Car> listOfCars = new ArrayList<Car>();
List<Vehicle> listOfVehicles = listOfCars;
listOfVehicles.add(new Bicycle());
// now the list of cars contain a bicycle. Not pretty.


不完全是因为add()可能使用View的方法,而ViewGroup中没有这种方法。

小结:ViewViewGroup,但ViewGroup不是View。多态性是您可以将View对象分配给ViewGroup声明的地方。