Java 向接口方法添加额外的类型参数可防止重写
下面的代码没有编译,这让我很惊讶。有人能解释为什么吗 Params.java:Java 向接口方法添加额外的类型参数可防止重写,java,generics,overriding,Java,Generics,Overriding,下面的代码没有编译,这让我很惊讶。有人能解释为什么吗 Params.java: public interface Params { <E> E test(Class<E> cls); interface MoreParams extends Params { @Override <E, F> E test(Class<E> cls); } } 公共接口参数{ E试验(cls级); 接口Mo
public interface Params {
<E> E test(Class<E> cls);
interface MoreParams extends Params {
@Override
<E, F> E test(Class<E> cls);
}
}
公共接口参数{
E试验(cls级);
接口MoreParams扩展了Params{
@凌驾
E试验(cls级);
}
}
汇编:
Params.java:6: error: name clash: <E#1,F>test(Class<E#1>) in
MoreParams and <E#2>test(Class<E#2>) in Params have the same
erasure, yet neither overrides the other
<E, F> E test(Class<E> cls);
^
where E#1,F,E#2 are type-variables:
E#1 extends Object declared in method <E#1,F>test(Class<E#1>)
F extends Object declared in method <E#1,F>test(Class<E#1>)
E#2 extends Object declared in method <E#2>test(Class<E#2>)
Params.java:5: error: method does not override or implement a
method from a supertype
@Override
^
2 errors
Params.java:6:错误:名称冲突:中的测试(类)
参数中的moreparms和test(Class)具有相同的
擦除,但两者都不能覆盖另一个
E试验(cls级);
^
其中E#1,F,E#2是类型变量:
E#1扩展方法测试中声明的对象(类)
F扩展方法测试中声明的对象(类)
E#2扩展方法测试中声明的对象(类)
java:5:error:method不重写或实现
方法从超类型中删除
@凌驾
^
2个错误
如果相关,我使用的是java-8-oracle
,javac
版本1.8.0\u 25
似乎额外的泛型类型参数对类型签名没有明显的影响,那么为什么它会破坏覆盖?我认为这可能与二进制兼容性有关,尽管您得到的确切错误消息可能令人困惑 在添加
moreparms
界面之前,请考虑编写的代码:
Params params = new ParamsSubClass();
String str1 = params.test(String.class);
String str2 = params.<>test(String.class);
String str3 = params.<String>test(String.class);
Params Params=new paramsubclass();
String str1=params.test(String.class);
String str2=params.test(String.class);
String str3=params.test(String.class);
当您使用类似于MoreParamsSubClass
的类而不是我们的人工paramsubclass
时,涉及str1
和str2
的行仍将工作,但是涉及str3
的行将不再工作,因为需要两个类型参数,因此,代码不是二进制兼容的
因此,在更改类型参数时,似乎无法重写方法,因为这将破坏二进制兼容性