Java:泛型继承混淆

Den*_*hev 3 java oop generics inheritance overriding

想象一下,我们有以下课程:

public interface MyInterface<T> {
    List<T> getList(T t);
}

abstract class BaseClass<T extends Number> implements MyInterface<T> {
    @Override
    public List<T> getList(Number t) {
        return null;
    }
}

class ChildClass extends BaseClass<Integer> {
    @Override
    public List<Integer> getList(Integer t) {
        return super.getList(t);  //this doesn't compile
    }
}
Run Code Online (Sandbox Code Playgroud)

getListChildClass不编译时,输出为:

abstract method getList(T) in com.mypackage.MyInterface cannot be accessed directly
Run Code Online (Sandbox Code Playgroud)

我无法BaseClass.getList理解为什么在ChildClass中没有覆盖方法.

但令我完全困惑的是使其编译的修复:

class ChildClass extends BaseClass<Integer> {
    @Override
    public List<Integer> getList(Integer t) {
        return super.getList((Number) t);  //Now it compiles!
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我将Integer转换为Number,并解决了这个问题.

谁能解释一下这段代码中发生了什么?

Mar*_*arc 5

您的基类应如下所示:

abstract class BaseClass<T extends Number> implements MyInterface<T> {
    @Override
    public List<T> getList(T t) {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

您没有使用T,而是使用Number类作为参数.

  • 因为你调用了getList(Integer t),它引用了来自接口的getList(T t)(没有实现).getList(Number t)是一个重载函数,但那个不是最佳匹配. (2认同)