3

以下代码

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);
4

1 回答 1

11

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

void surrender(List l)

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

基本上,您应该尽可能避免使用原始类型。有关更多详细信息,请点击上面 JLS 部分的链接,或阅读Java 泛型常见问题解答

于 2013-08-16T16:15:50.380 回答