public <A extends Interface1,I extends Interface2> I Method(A a);
这是界面中的方法。当我覆盖此接口方法时,我可以将I
替换为任何实现Interface2的类,但如果它是Interface1的子类,则拒绝参数A
。它只能是Interface1类型。所以,当我尝试:
public SubTypeofInterface2 Method(Interface1 a); //fine
public SubTypeofInterface2 Method(SubTypeofInterface1 a); // not accepted
为什么会这样?
答案 0 :(得分:1)
实现类中的方法被认为是覆盖接口方法,只有当两个方法的擦除相同或者实现类中的方法擦除与接口中方法的擦除完全兼容时才会被覆盖。
那么界面中方法的擦除是什么?它是这样的:
public Interface2 method(Interface1 a);
所以,在你的两种方法中:
public SubTypeofInterface2 Method(Interface1 a); //fine
public SubTypeofInterface2 Method(SubTypeofInterface1 a); // not accepted
只有第一个覆盖与擦除方法兼容。允许返回类型的协变类型。
但第二种方法不是覆盖兼容。覆盖时参数中不允许使用协变类型。这就是它无法编译的原因。
它的工作方式与普通的非泛型方法覆盖相同:
interface Test {
Object get(Object obj);
}
class TestImpl implements Test {
// Valid override
@Override
public String get(Object obj) { return null; }
// This doesn't override interface method.
public String get(String obj) { return null; }
}
答案 1 :(得分:0)
这是因为您的方法需要能够处理Interface1的任何子类型。如果用户想要将不同的 Interface1子类型传递给您的方法,会发生什么?界面告诉用户他们可以,但您对该界面的实现不一致。因此错误。
答案 2 :(得分:0)
查找&#34;逆变&#34;。方法参数处于逆变位置。即使Java足够酷以支持这种子类型关系,你的子类也必须看起来像
public SubTypeofInterface2 Method(SuperTypeofInterface1 a);