我有一个定义方法C<T>
的泛型类doStuff(T arg)
。我想定义一个子类S来重构对doStuff
的访问,让我们举一个例子,它必须是Number
。我走到这一步:
public class C<T> {
public void doStuff(T arg) {}
}
public class S<T extends Number> extends C<T> {
public void doStuff(T arg) {
Number n = (Number) arg;
}
}
但是,这意味着我必须在T
方法中将Number
投射到S
。有一种优雅的方法可以避免这种情况吗?
谢谢!
答案 0 :(得分:1)
所以,有几件事:
C<T>
未绑定。S<T extends Number>
绑定到Number
及其子类。因此,实际上,您已经完成了自己想做的事情。由于T
中的S
已绑定到Number
,因此无需投射。
如果您创建了 C<T>
的其他子类,并在T
...
public class Q<T extends Date> extends C<T>
public class R<T extends Collection> extends C<T>
...所有这些类的T
都会受到extends
子句右边任何内容的限制。
答案 1 :(得分:1)
因为T
无论如何都是Number
的子类,所以你根本不需要进行投射。以你的例子:
public class C<T> {
public void doStuff(T arg) {}
}
public class S<T extends Number> extends C<T> {
public void doStuff(T arg) {
System.out.println(arg instanceof Number);
}
}
doStuff()
总是会返回true(arg
等于null
除外)。
答案 2 :(得分:0)
您可以完全删除广告。
如果它不起作用,泛型将是非常弱的功能。