我正在从事一个涉及从字符串/流中读取结构的项目。 作为我设计的一部分,我尝试按照以下思路创建一些东西:
-
public class Thing;
-
public class SpecialThing extends Thing;
-
public class ShinyThing extends Thing;
-
public abstract class ThingDeserialiser implements Iterable<Thing>;
-
public abstract class GenericThingDeserialiser<T extends Thing> extends ThingDeserialiser implements Iterable<T>;
-
public class SpecialThingDeserialiser extends GenericThingDeserialiser<SpecialThing>;
-
public class ShinyThingDeserialiser extends GenericThingDeserialiser<ShinyThing>;
但是我收到一个错误 GenericThingDeserialiser
因为两者之间存在冲突
-
ThingDeserialiser
实现Iterable<Thing>
和 -
GenericThingDeserialiser
试图实现Iterable<T>
.
我可以在 C#
中创建这样的设置,为什么我无法在 Java
中执行此操作? ?
有办法解决这个问题吗?
我也考虑过删除 ThingDeserialiser
希望ShinyThingDeserialiser
和 SpecialThingDeserialiser
可能都可以转换为 GenericThingDeserialiser<Thing>
,但正如预期的那样,这是行不通的。
我有另一个涉及接口(interface)的想法,但我想在继续之前停下来寻求建议。
如果不是很明显,一般的想法是 Thing
对象是根据相当简单的模式从字符串/流中检索的。
最佳答案
I am able to create a set up like this in C#, why am I unable to do this in Java?
因为 Java 中的泛型不是协变的。
也就是说,即使你有类型 A
和 B
, 和 B
延伸A
, 类 Foo<B>
不会是 Foo<A>
的子类型.由于类型删除,在运行时,两者都是 Foo
.
如前所述,您真的应该摆脱 ThingDeserialiser
在这里,只需处理 GenericThingDeserializer<T extends Thing> implements Iterable<T>
.然后你可以创建,比如说,MyThingDeserialiser implements GenericThingDeserialiser<MyThing>
.
关于Java - 冲突的接口(interface)类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26608422/