[英]Java - Conflicting interface type parameters
我正在开发一个涉及从字符串/流中读取结构的项目。 作为我设计的一部分,我试图沿着这些方向创建一些东西:
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>
,但正如预期的那样,它不会起作用。
我有另一个涉及接口的想法,但我想在继续之前停下来寻求建议。
如果不是很明显,一般的想法是基于合理的琐碎模式从字符串/流中检索Thing
对象。
我能够在C#中创建这样的设置,为什么我无法在Java中执行此操作?
因为Java中的泛型不是协变的。
也就是说,即使你有类型A
和B
,并且B
扩展了A
,类Foo<B>
也不会是Foo<A>
的子类型。 由于类型擦除,在运行时,两者都将是Foo
。
正如已经建议的那样,你应该在这里摆脱ThingDeserialiser
,只需要使用GenericThingDeserializer<T extends Thing> implements Iterable<T>
。 然后,您可以创建,例如, MyThingDeserialiser implements GenericThingDeserialiser<MyThing>
。
我肯定会建议删除ThingDeserialiser。 你说你想将ShinyThingDeserialiser和SpecialThingDeserializer转换为GenericThingDeserialiser <Thing>,但这不起作用。 你应该能够将它们转换为GenericThingDeserialiser <? 延伸事>。 这有帮助吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.