声明泛型类中定义的类型的变量时出现Boundmismatch错误

时间:2018-06-06 01:37:25

标签: java generics wildcard bounds

类定义为Header<Field<Column<Content<?>>>>{},变量声明为Header<Field<Column<Content<String>>>> aHeader。这给出了BoundMismatch错误。将声明更改为Header<Field<Column<Content<?>>>> aHeader;删除错误但丢失类型信息,因此不需要。使这项工作的策略是什么? PS:类定义必须保留?。

1 个答案:

答案 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