
[英]Handling generic class members when there is no generic type variable defined in class
[英]Boundmismatch error when declaring a variable of a type defined in a generic class
类定义为Header<Field<Column<Content<?>>>>{}
,变量声明为Header<Field<Column<Content<String>>>> aHeader
。 这给出了BoundMismatch错误。 将声明更改为Header<Field<Column<Content<?>>>> aHeader
; 消除了错误,但丢失了类型信息,因此是不希望的。 使这项工作有效的策略是什么? PS:类定义必须保留?。
类型为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:生产者扩展,消费者超级。
这是用于记住范围的助记符设备。
但是,集合既可以充当收藏夹,也可以添加和弹出东西。 因此,通常将它们限制为单一类型。
您可以将字符串添加到的集合吗?
不可以。通配符是类型限制,它可以是任何类型的集合。 这并不意味着它可以包含所有类型。
那么通配符有什么用呢? https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html
展示了一些很好的例子,它们可以用来限制集合本身的类型,而不是将集合定义为可以接受任何对象。
例如
public void addRectangle(List<? extends Shape> shapes) {
// Compile-time error!
shapes.add(0, new Rectangle());
}
是一个编译错误,因为唯一的保证就是shapes是扩展Shape的事物的集合,它可能是List<Circle>
!
在哪里
public void addRectangle(List<Shape> shapes) {
shapes.add(0, new Rectangle());
}
因为Rectangle是一个形状,所以效果很好,并且形状现在可以包含任何形状。
使这项工作有效的策略是什么?
保持对“ PS:类定义必须保留?”的限制。 除了显式强制转换之外,我看不到任何使其有效的方法。
只要类定义包含通配符,就永远不能确定它是什么类型。 这也是为什么不能将它们用作类的类型参数的原因。
您可能感兴趣的只是普通的普通泛型类型参数
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.