繁体   English   中英

声明通用类中定义的类型的变量时,Boundmismatch错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM