无法实现具有不同类型参数的接口
问题描述:
我有一个通用接口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> {
}
答
这是没有意义的,如果你能,诚实。
这里的情景:
-
B
实现A
并结合A<T>
到A<String>
。从B
-
C
继承(这是已经势必A<String>
),和你想,也能实现A<Number>
。
你不能有一种类型实现两种方式。
如果你想以某种方式结合Number
为C
,那么你就必须有类型上C
,而不仅仅是A
。
这将编译但它看起来很奇怪:
public class C<T> extends B implements A<String> {
}
归根结底,这真的归结到您的层次结构需要如何进行布局。如果你确实需要B
和C
之间的关系,那么用这种方式来具体化它们的类型是没有意义的;只需让他们使用T
作为通用。最后,凭借继承权,您仍然可以通过中的A
到C
访问总合同,因此您无需实施它。
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。
如果你提供了一个代码框架来处理它,那么回答这个问题会稍微容易些。没什么特别的,但足以重现你面临的同样的错误。 – Makoto
@Raj在问题上请 – GurV
怎么可能?考虑一下。 C已经实现了A到B. –
GurV