无法编译实现没有类型参数的接口的类

Dal*_*and 6 java generics overriding type-erasure type-parameter

我有以下测试代码:

public interface Container<I> {
    public void addClass(Class<?> clazz);
}

public class MyContainer implements Container {
    public void addClass(Class<?> clazz) {}
}
Run Code Online (Sandbox Code Playgroud)

尝试编译这两个类时,我收到以下错误:

MyContainer.java:1:MyContainer不是抽象的,不会覆盖Container中的抽象方法addClass(java.lang.Class)

如果我在MyContainer中向Container接口添加一个类型(例如<Object>),我就不会收到错误.

问题是我将类型参数引入到Container,它是公共API的一部分,因此为了兼容性,我不能让所有实现类都无法编译.

有人有主意吗?这是类型擦除问题吗?有解决方法吗?

Jon*_*eet 7

我认为问题在于,如果你在类声明中的任何地方使用原始类型,那么你就会选择退出泛型.所以这将工作 - 请注意参数更改.

public class MyContainer implements Container {
    public void addClass(Class clazz) {}
}
Run Code Online (Sandbox Code Playgroud)

JLS第4.8节开始:

原始类型的超类(分别是超接口)是其任何参数化调用的超类(超级接口)的擦除.

相信这是相关的一点......擦除Container<T>.addClass(Class<?> clazz)addClass(Class clazz).

但是,基本上除非这是真正的遗留代码,否则您应该将类​​型参数引入接口作为重大变化.