类定义为Header<Field<Column<Content<?>>>>{}
,变量声明为Header<Field<Column<Content<String>>>> aHeader
。这给出了BoundMismatch错误。将声明更改为Header<Field<Column<Content<?>>>> aHeader
;删除错误但丢失类型信息,因此不需要。使这项工作的策略是什么? PS:类定义必须保留?。
答案 0 :(得分:0)
Header<Field<Column<Content<String>>>>
类型的变量只能包含Header<Field<Column<Content<String>>>>
它没有上限或下限,只能包含Header<Field<Column<Content<String>>>>
Header<Field<Column<Content<?>>>>
代表Header<Field<Column<Content<**unknown**>>>>
当你从未知变体中取回字符串时,你怎么能确定你总会得到一个字符串?你不能。因此,您会收到上述错误,警告您无法将通配符集合分配给字符串。
收藏品既是生产者,也是消费者。
作为一般经验法则,PECS: Producers Extend, Consumers Supers.
这是一个记忆边界的助记设备。
然而,一个集合充当两者,它可以添加和弹出的东西。因此,通常它们仅限于一种类型。
您可以将字符串添加到?
的集合中没有。通配符是一种类型限制,表示它可以是任何类型的集合。这并不意味着它可以包含每种类型。
那么通配符有什么用呢? https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html
显示一些很好的示例,它们可用于限制集合本身的类型,而不是将集合定义为能够接受任何对象。
e.g。
public void addRectangle(List<? extends Shape> shapes) {
// Compile-time error!
shapes.add(0, new Rectangle());
}
编译错误,因为唯一的保证是,形状是扩展Shape的东西的集合,它可能是List<Circle>
!
在哪里
public void addRectangle(List<Shape> shapes) {
shapes.add(0, new Rectangle());
}
工作正常,因为Rectangle是一个形状,而形状现在可以包含任何形状。
使这项工作的策略是什么?
保持对&#34; PS的限制:类定义必须保留?。&#34;除了明确的演员之外,我认为没办法让它发挥作用。
只要类定义包含通配符,就无法确定它是什么类型。这也是他们cannot be used as type parameters of classes.
的原因您可能感兴趣的是普通的Generic Type Parameters