繁体   English   中英

Java - 冲突的接口类型参数

[英]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 ,希望ShinyThingDeserialiserSpecialThingDeserialiser都可以转换为GenericThingDeserialiser<Thing> ,但正如预期的那样,它不会起作用。

我有另一个涉及接口的想法,但我想在继续之前停下来寻求建议。

如果不是很明显,一般的想法是基于合理的琐碎模式从字符串/流中检索Thing对象。

我能够在C#中创建这样的设置,为什么我无法在Java中执行此操作?

因为Java中的泛型不是协变的。

也就是说,即使你有类型AB ,并且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.

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