重载有界泛型时,如何 return 正确的类型?

When overloading bounded generics, how can I return the right type?

以下代码给出编译错误。我怎样才能避免这种情况?

public class C<T> {

    public T doStuff(T arg) {}

}

public class S<T extends Number> extends C<T> {

    public T doStuff(T arg) {
        return new Integer(0);
    }

}

谢谢!

所以这个声明是非法的,因为虽然你说 T 一些 Number,但没有办法明确规定T 具体来说 始终是 Integer

public T doStuff(T arg) {
    return new Integer(0);
}

T 很可能是 LongFloatBigInteger,其中 none 是 Integer

幸运的是,Number 具有 intValue() 方法,它允许您从任何 Number 类型中获取 int。您可以改用它:

public Integer doStuff(T arg) {
    return new Integer(arg.intValue());
}

将不得不改变您的 doStuff 方法在父 class 中的工作方式;向该方法引入一个新的类型参数。

public <S> S doStuff(S arg) {
    return arg;
}

当然,这意味着现在 doStuff 方法也未绑定。如果你真的想为整个 class 保持 Number 的界限,你必须让你的 class 使用你关心的实际具体类型。

class S extends C<Integer> {
    public Integer doStuff(Integer arg) {
        return 0;
    }
}