如何向接口添加未使用的泛型参数会阻止实现它的类?

Dun*_*gor 3 java generics interface

以下代码

public interface IGiveUp
{
    void surrender(List<Class> l);
}
public class GiveUp implements IGiveUp {

    @Override public void surrender(List<Class> l) {}
}
Run Code Online (Sandbox Code Playgroud)

编译好.但是当我向接口添加一个未使用的泛型类型参数时

public interface IGiveUp<X>
{
    void surrender(List<Class> l);
}
Run Code Online (Sandbox Code Playgroud)

它无法编译(javac 1.6.0_23)

IGiveUp.GiveUp is not abstract and does not override abstract method surrender(java.util.List)
Run Code Online (Sandbox Code Playgroud)

如果我在实现中指定泛型,它将编译

public class GiveUp implements IGiveUp<Object>
Run Code Online (Sandbox Code Playgroud)

或使方法参数成为非泛型类型的列表

void surrender(List l);
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 11

您的类正在尝试实现原始类型 IGiveUp - 原始类型对泛型不了解,因此类型擦除后的方法签名就是:

void surrender(List l)
Run Code Online (Sandbox Code Playgroud)

方法参数没有使用接口声明中的类型参数也没关系:type erasure 从签名中删除所有泛型的痕迹.

基本上,你应该尽可能避免原始类型.有关更多详细信息,请按照上面的链接查看JLS的各个部分,或阅读Java Generics FAQ.