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

时间:2013-08-16 16:10:01

标签: java generics interface

以下代码

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

    @Override public void surrender(List<Class> l) {}
}

编译好。但是当我向接口

添加一个未使用的泛型类型参数时
public interface IGiveUp<X>
{
    void surrender(List<Class> l);
}

无法编译(javac 1.6.0_23)

IGiveUp.GiveUp is not abstract and does not override abstract method surrender(java.util.List)

如果我在实现中指定泛型

,它将编译
public class GiveUp implements IGiveUp<Object>

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

void surrender(List l);

1 个答案:

答案 0 :(得分:11)

您的班级正在尝试实施raw type IGiveUp - 原始类型对泛型不了解,因此type erasure之后的方法签名就是:

void surrender(List l)

方法参数没有使用接口声明中的类型参数并不重要:type erasure从签名中删除泛型的所有痕迹。

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