我有一个通用接口(interface) A<T>
,我有一个实现 A<String>
的 B 类.我创建了一个类 C
延伸 B
并实现 A<Number>
.
对于 C
,我得到一个编译错误说:
A cannot be inherited with different type arguments <String> and <Number>.
为什么不允许这样做? 如果答案是 type erasure ,那么请详细解释。
示例代码:
public interface A<T> {
}
public class B implements A<String> {
}
public class C extends B implements A<Number> {
}
最佳答案
老实说,如果可以的话,那也没有意义。
场景如下:
-
B
工具A
并绑定(bind)A<T>
至A<String>
. -
C
继承自B
(它已经绑定(bind)到A<String>
),并且您还试图实现A<Number>
.
你不能用两种方式实现一个类型。
如果你想合并Number
以某种方式进入C
,那么您必须on C
类型而不仅仅是 A
.
这会编译,但看起来会很奇怪:
public class C<T> extends B implements A<String> {
}
最终这真的归结为您的层次结构需要如何布局。如果您真的需要 B
之间的关系和 C
,那么以这种方式具体化它们的类型就没有意义;让他们使用 T
作为通用代替。最后,凭借继承,你仍然可以访问A
的总合约通过B
在C
,因此您无需实现它。
public interface A<T> {
}
public class B<T> implements A<T> {
}
public class C<T> extends B<T> {
}
关于java - 无法使用不同类型的参数实现接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41326735/