Java - 冲突的接口(interface)类型参数

标签 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 中执行此操作? ?

有办法解决这个问题吗?


我也考虑过删除 ThingDeserialiser希望ShinyThingDeserialiserSpecialThingDeserialiser可能都可以转换为 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 中的泛型不是协变的。

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

相关文章:

java - 奇怪的结果增加了一个超过其最大值的短路

Java 如何识别字符串数组的哪些值不存在于对象列表中?

java - RESTEasy 启用 GZIP 支持?

java - 删除字符串中的前括号和尾括号

java - 为什么我可以从 LocalContainerEntityManagerFactoryBean bean 定义中获取 EntityManagerFactory 对象?

java - 在 @RestController 的 @PathVariable 上自定义 @JsonDeserialize

Java poi将xml转换为xls

java - 使用 Java Spring 和 SSL 访问本地主机 URL

java - 无法使用 Ant 构建 JavaFX 应用程序

Java LWJGL 多剪刀测试