以下代码给出了编译错误。我怎么能避免这个?
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);
}
}
谢谢!
答案 0 :(得分:2)
所以这个声明是非法的,因为虽然你说T
某些类Number
,但是没有办法明确强制T
具体始终为Integer
。
public T doStuff(T arg) {
return new Integer(0);
}
T
可能是Long
或Float
或BigInteger
,其中没有一个是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;
}
}