我想知道为什么这是一个有效的覆盖:
public abstract class A {
public abstract <X> Supplier<X> getSupplier();
public static class B extends A {
@Override
public Supplier<String> getSupplier() {
return String::new;
}
}
}
Run Code Online (Sandbox Code Playgroud)
虽然这不是:
public abstract class A {
public abstract <X> Supplier<X> getSuppliers(Collection<String> strings);
public static class B extends A {
@Override
public Supplier<String> getSuppliers(Collection<String> strings) {
return String::new;
}
}
}
Run Code Online (Sandbox Code Playgroud)
根据JLS§8.4.8.1,B.getSupplier必须是一个副主题A.getSupplier:
在类C中声明或继承的实例方法mC,覆盖C类中声明的另一个方法mA,iff以下所有条件都为真:
- ...
- mC的签名是mA签名的子签名(§8.4.2).
- ...
Subsignatures定义在JLS§8.4.2:
两种方法或构造,M和N,具有相同的签名,如果它们具有相同的名称,相同类型的参数(如果有的话)(§8.4.4),并且,调整所述形参类型的N到所述类型参数后M,相同的形式参数类型.
方法m1的签名是方法m2的签名的子签名,如果:
因此它似乎B.getSupplier …