繁体   English   中英

Java Generics 不接受使用正确类型扩展父级的 class

[英]Java Generics not accepting class that extends parent with correct type

我正在尝试创建一些结构类,以便可以轻松构建结构,但 generics 不接受 class ,即使它似乎具有正确的类型。

我有一个基本Structure class ,它只存储泛型类型T的父级:

public abstract class Structure<T>{...}

然后我有一个KeyedStructure ,它存储类型为K的键和扩展类型为VStructure

public abstract class KeyedStructure <K, V> extends  Structure<V>{...}

最后,我有一个KeyedBidirectionalStructure class 类型<K, PARENT, CHILD>CHILD必须能够将此 class 存储为其父级,因此它扩展KeyedStructure<K, KeyedBidirectionalStructure<K, PARENT, CHILD>>

public abstract class KeyedBidirectionalStructure<K, PARENT, CHILD extends KeyedStructure<K, KeyedBidirectionalStructure<K, PARENT, CHILD>>> extends KeyedStructure<K, PARENT>{...}

但是当我尝试像这样实现它时:

class Group extends KeyedBidirectionalStructure<String, Group, Group>{...}

甚至像这样

class Task extends KeyedStructure<String, Group>{...}
class Group extends KeyedBidirectionalStructure<String, Group, Task>

Java 一直抱怨CHILD类型确实扩展了正确的 class 但它似乎适合 generics。 如果有人可以帮助我,将不胜感激。 谢谢你。

您的Group声明扩展KeyedBidirectionalStructure ,第三个类型参数(对于CHILD )是Group 所以这个Group需要满足CHILD的界限,其中所有的东西都被替换了,是extends KeyedStructure<String, KeyedBidirectionalStructure<String, Group, Group>> 但这并不能满足这一点。 Group扩展KeyedBidirectionalStructure<String, Group, Group>进而扩展KeyedStructure<String, Group> 你看得到差别吗? 在一种情况下,第二种类型参数是Group ,而在另一种情况下,第二种类型参数是KeyedBidirectionalStructure<String, Group, Group> 他们不匹配。

通用类型 arguments 是不变的。 List<String>不是List<Object>的子类型,即使StringObject的子类型。 所以同样KeyedStructure<String, Group>不是KeyedStructure<String, KeyedBidirectionalStructure<String, Group, Group>>的子类型,即使GroupKeyedBidirectionalStructure<String, Group, Group>的子类型。

如果您想要 arguments 类型的多态性,则需要使用通配符。 因此,如果您将绑定更改为这样的内容,则您的Group声明应该有效:

public abstract class KeyedBidirectionalStructure<K, PARENT,
    CHILD extends KeyedStructure<K, ? extends KeyedBidirectionalStructure<K, PARENT, CHILD>>>
    extends KeyedStructure<K, PARENT> {...}

但是,使用通配符还有其他后果,如果不了解您的完整设计,我不确定它是否有意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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