无法实现具有不同类型参数的接口

问题描述:

我有一个通用接口A<T>,我有一个B类实现A<String>。我创建了一个类C,它延伸B并实施A<Number>。 为C,我得到一个编译错误说法:无法实现具有不同类型参数的接口

A cannot be inherited with different type arguments <String> and <Number>.

这是为什么不允许? 如果答案是类型删除,请详细解释。

示例代码:

public interface A<T> { 

} 

public class B implements A<String> { 

} 

public class C extends B implements A<Number> { 
} 
+2

如果你提供了一个代码框架来处理它,那么回答这个问题会稍微容易些。没什么特别的,但足以重现你面临的同样的错误。 – Makoto

+0

@Raj在问题上请 – GurV

+0

怎么可能?考虑一下。 C已经实现了A 到B. – GurV

这是没有意义的,如果你能,诚实。

这里的情景:

  • B实现A并结合A<T>A<String>。从B
  • C继承(这是已经势必A<String>),和你想,也能实现A<Number>

你不能有一种类型实现两种方式。

如果你想以某种方式结合NumberC,那么你就必须有类型C,而不仅仅是A

这将编译但它看起来很奇怪:

public class C<T> extends B implements A<String> { 

} 

归根结底,这真的归结到您的层次结构需要如何进行布局。如果你确实需要BC之间的关系,那么用这种方式来具体化它们的类型是没有意义的;只需让他们使用T作为通用。最后,凭借继承权,您仍然可以通过中的AC访问总合同,因此您无需实施它。

public interface A<T> { 


} 

public class B<T> implements A<T> { 

} 

public class C<T> extends B<T> { 

} 

Java语言规范在§8.1.5状态以下:

类不能同时是两种接口类型 它们是相同的通用的不同参数的子类型接口 (第9.1.2节)或通用接口 的参数化的子类型以及命名相同通用接口的原始类型或编译时间 错误。

这一要求是为了引入以支持 翻译类型擦除(§4.6)。

这意味着擦除后,您的类可以以相同的签名结束方法(如果有的话)。详情请参阅Angelika Langer的site