当重载有界泛型时,如何返回正确的类型?

时间:2015-02-14 18:40:05

标签: java generics

以下代码给出了编译错误。我怎么能避免这个?

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);
    }

}

谢谢!

1 个答案:

答案 0 :(得分:2)

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

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

T可能是LongFloatBigInteger,其中没有一个是Integer

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

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

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

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

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

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