Java - 冲突的接口类型参数

问题描述:

我正在研究涉及从字符串/流中读取结构的项目。 作为我设计的一部分,我试图创建这些方针的东西:Java - 冲突的接口类型参数

  • 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中做到这一点?

有没有办法解决这个问题?


我也认为,希望ShinyThingDeserialiserSpecialThingDeserialiser可能都被强制转换为GenericThingDeserialiser<Thing>去除ThingDeserialiser,但预计这不会工作。

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

如果不明显,总体思路是基于合理的微不足道的模式从字符串/流中检索Thing对象。

+0

@CarlosBribiescas我以我的方式尝试事物的主要原因是我对C#和C#中的工作有更多的经验,所以我习惯于这样的工作。我在顶部有一个ThingDeserialiser的主要原因是我可以收集一些ThingDeserialiser,它们可以是任何形式的GenericThingDeserialiser或者任何其他的链接。此外,可以扩展“ThingDeserialiser”,而不是通用版本,例如包装可能生成“ShinyThing”或“SpecialThing”的工厂。长话短说:灵活性。 – Pharap 2014-10-28 13:04:47

我肯定会建议删除ThingDeserialiser。你说你想将ShinyThingDeserialiser和SpecialThingDeserializer投射到GenericThingDeserialiser < Thing>,但那不行。你应该可以将它们投射到GenericThingDeserialiser <?延伸Thing>。这有帮助吗?

+1

啊,我完全忘记了通配符。谢谢你提醒我他们存在。 – Pharap 2014-10-28 12:54:03

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

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

也就是说,即使你有类型ABB扩展A,类Foo<B>不会是Foo<A>一个亚型。由于类型擦除,在运行时,两者都将是Foo

正如已经暗示的那样,您应该在这里摆脱ThingDeserialiser,并且仅仅使用GenericThingDeserializer<T extends Thing> implements Iterable<T>。然后,您可以创建,例如,MyThingDeserialiser implements GenericThingDeserialiser<MyThing>

+1

“因为Java中的泛型不是协变的。”这正是我期待的答案。我最初确实接受了这一点,但是@David对通配符提出了一个很好的观点,理想情况下我愿意接受这两个通配符,但由于他的代表略低,所以我接受了他的答案。 – Pharap 2014-10-28 12:53:09

+0

多数民众赞成你Pharap。至于fge,我把你的答案upvoted;) – 2014-10-28 12:55:41

+0

@DavidtenHove可能违反网站的指导方针,但我以前见过。再一次,我希望能够接受两者,但它可能需要更多的努力,而不是提供奖励。 – Pharap 2014-10-28 13:11:56