相关疑难解决方法(0)

添加参数后,覆盖具有泛型返回类型的方法失败

我想知道为什么这是一个有效的覆盖:

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的签名的子签名,如果:

  • m2与m1具有相同的签名,或
  • m1的签名与m2签名的擦除(§4.6)相同.

因此它似乎B.getSupplier …

java generics overriding

17
推荐指数
1
解决办法
234
查看次数

标签 统计

generics ×1

java ×1

overriding ×1