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

下面的代码没有编译,这让我很惊讶。有人能解释为什么吗

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级);
接口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
的行将不再工作,因为需要两个类型参数,因此,代码不是二进制兼容的

因此,在更改类型参数时,似乎无法重写方法,因为这将破坏二进制兼容性