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.