Java generic parameters and inheritance
假设我们知道视图组扩展了视图。此外,我们还有一个通用的、参数化的class A。
问题:为什么不把C.add()作为参数来接受new A()?因为多态性,它不应该工作吗?
解决方案:singning add with ? extends View让add接受new A()作为参数。
- 虽然我没有得到你确切想要说的,但是这个链接可能会帮助你:stackoverflow.com/questions/6909995/…
您签署的add方法为:
1
| static void add(A<View>) |
但你可能是说:
1
| static void add(A<? extends View> a) |
- 这仍然不起作用,因为new A()无效。
- @茨库齐,你什么意思?就像是new ArrayList()。
- 这个行动有一个错误的问题。他最初说视图扩展了视图组。P
- thnx,用add(A extends View> a)签署add,让add()接受new A()thnx。对不起,我的第一个错别字。
首先,您所说的视图扩展了视图组,但图表显示视图组扩展了视图(我认为这是正确的)。
第二,不允许您将List作为List通过。这是一个编译时保护,防止有人将另一个视图添加到此列表中,并危害泛型的类型安全。
List不是List的亚型,而是List extends View>的亚型。因此,您可以修改您的方法来接受一个List extends View>,但是要注意,您不能添加到以这种方式传递给方法的列表中。
还有另一种称为下界通配符(List super ViewGroup>的语法),与上面提到的上界通配符不同,它允许您添加到列表中,但可以在视图组或其父级列表中进行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. |
- 对不起,刚刚编辑了这个句子,当然是ViewGroup extends View这里。
不完全是因为add()可能使用View的方法,而ViewGroup中没有这种方法。
小结:View是ViewGroup,但ViewGroup不是View。多态性是您可以将View对象分配给ViewGroup声明的地方。
- 你说"我们知道视图扩展了视图组"。奥欧
- 对不起的。。。当然,viewgroup扩展了视图,就像类图上那样