在Java中重载而不强制转换时,是否可以限制泛型类型?
我有一个泛型类在Java中重载而不强制转换时,是否可以限制泛型类型?,java,generics,Java,Generics,我有一个泛型类C,它定义了一个方法doStuff(T arg)。我想定义一个子类S,它重构对doStuff的访问,让我们举一个必须是数字的例子。我走了这么远: public class C<T> { public void doStuff(T arg) {} } public class S<T extends Number> extends C<T> { public void doStuff(T arg) { Num
C
,它定义了一个方法doStuff(T arg)
。我想定义一个子类S,它重构对doStuff
的访问,让我们举一个必须是数字的例子。我走了这么远:
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;
}
}
公共C类{
公共无效doStuff(T arg){}
}
公共类S扩展了C{
公共真空度(T参数){
数字n=(数字)arg;
}
}
然而,这意味着我必须在S
方法中将T
转换为Number
。有没有一种优雅的方法可以避免这种情况
谢谢 您可以完全移除铸件。
如果它不起作用,泛型将是非常弱的特性。因此,有几件事:
C
未绑定
S
绑定到Number
及其子类
所以,实际上,你已经完成了你想做的事情。由于S
中的T
已绑定到Number
,因此不需要强制转换
为了进一步推断,如果您创建了C
的其他子类,在其中定义了T
的边界
公共类Q扩展C
公共类R扩展了C
…所有这些类的T
都将被extends
子句右侧的任何内容绑定。因为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);
}
}
公共C类{
公共无效doStuff(T arg){}
}
公共类S扩展了C{
公共真空度(T参数){
System.out.println(参数instanceof Number);
}
}
doStuff()
将始终返回true(除了arg
等于null
)。无需强制转换:。我已将此问题回滚。虽然我能理解你可能认为你之前的问题是一个后续问题,但事实并非如此;这是一个概念上不同的问题。我强烈建议你围绕这个问题提出一个新问题,因为在这里添加这个问题可能会使你以前问题的现有答案无效。可以理解,提出了新问题。谢谢!在这种情况下,如何返回数字?我已经编辑了我的问题,包括这个。我觉得你应该问一个新问题。你以前问过的和现在问的在概念上是不同的。