[英]Java Generics not accepting class that extends parent with correct type
我正在尝试创建一些结构类,以便可以轻松构建结构,但 generics 不接受 class ,即使它似乎具有正确的类型。
我有一个基本Structure
class ,它只存储泛型类型T
的父级:
public abstract class Structure<T>{...}
然后我有一个KeyedStructure
,它存储类型为K
的键和扩展类型为V
的Structure
:
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>
的子类型,即使String
是Object
的子类型。 所以同样KeyedStructure<String, Group>
不是KeyedStructure<String, KeyedBidirectionalStructure<String, Group, Group>>
的子类型,即使Group
是KeyedBidirectionalStructure<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.