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
中做到这一点?
有没有办法解决这个问题?
我也认为,希望ShinyThingDeserialiser
和SpecialThingDeserialiser
可能都被强制转换为GenericThingDeserialiser<Thing>
去除ThingDeserialiser
,但预计这不会工作。
我有另一个涉及接口的想法,但我想在继续之前停下来寻求建议。
如果不明显,总体思路是基于合理的微不足道的模式从字符串/流中检索Thing
对象。
我肯定会建议删除ThingDeserialiser。你说你想将ShinyThingDeserialiser和SpecialThingDeserializer投射到GenericThingDeserialiser < Thing>,但那不行。你应该可以将它们投射到GenericThingDeserialiser <?延伸Thing>。这有帮助吗?
啊,我完全忘记了通配符。谢谢你提醒我他们存在。 – Pharap 2014-10-28 12:54:03
我能够在C#中创建这样的设置,为什么我无法在Java中执行此操作?
因为Java中的泛型不是协变的。
也就是说,即使你有类型A
和B
和B
扩展A
,类Foo<B>
不会是Foo<A>
一个亚型。由于类型擦除,在运行时,两者都将是Foo
。
正如已经暗示的那样,您应该在这里摆脱ThingDeserialiser
,并且仅仅使用GenericThingDeserializer<T extends Thing> implements Iterable<T>
。然后,您可以创建,例如,MyThingDeserialiser implements GenericThingDeserialiser<MyThing>
。
@CarlosBribiescas我以我的方式尝试事物的主要原因是我对C#和C#中的工作有更多的经验,所以我习惯于这样的工作。我在顶部有一个ThingDeserialiser的主要原因是我可以收集一些ThingDeserialiser,它们可以是任何形式的GenericThingDeserialiser或者任何其他的链接。此外,可以扩展“ThingDeserialiser”,而不是通用版本,例如包装可能生成“ShinyThing”或“SpecialThing”的工厂。长话短说:灵活性。 – Pharap 2014-10-28 13:04:47