重载有界泛型时,如何 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
很可能是 Long
或 Float
或 BigInteger
,其中 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;
}
}
以下代码给出编译错误。我怎样才能避免这种情况?
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
很可能是 Long
或 Float
或 BigInteger
,其中 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;
}
}