在 Java 中重载而不强制转换时是否可以限制泛型类型?
Is it possible to restrict generic types when overloading in Java without casting?
我有一个泛型 class C<T>
定义了一个方法 doStuff(T arg)
。我想定义一个 subclass 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;
}
}
然而,这意味着我必须在我的 S
方法中将 T
转换为 Number
。有没有一种优雅的方法可以避免这种情况?
谢谢!
您可以完全删除铸件。
如果它不起作用,泛型将是非常弱的特性。
所以,有几件事:
C<T>
未绑定。
S<T extends Number>
绑定到 Number
及其子节点 类。
所以,实际上,你已经完成了你想做的事情。转换是不必要的,因为 S
中的 T
已经绑定到 Number
.
进一步推断,如果您创建了 C<T>
的其他子 类,并在其中定义了 T
的边界...
public class Q<T extends Date> extends C<T>
public class R<T extends Collection> extends C<T>
...所有这些 类 的 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);
}
}
doStuff()
将始终 return 为真(除了 arg
等于 null
)。
我有一个泛型 class C<T>
定义了一个方法 doStuff(T arg)
。我想定义一个 subclass 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;
}
}
然而,这意味着我必须在我的 S
方法中将 T
转换为 Number
。有没有一种优雅的方法可以避免这种情况?
谢谢!
您可以完全删除铸件。
如果它不起作用,泛型将是非常弱的特性。
所以,有几件事:
C<T>
未绑定。S<T extends Number>
绑定到Number
及其子节点 类。
所以,实际上,你已经完成了你想做的事情。转换是不必要的,因为 S
中的 T
已经绑定到 Number
.
进一步推断,如果您创建了 C<T>
的其他子 类,并在其中定义了 T
的边界...
public class Q<T extends Date> extends C<T>
public class R<T extends Collection> extends C<T>
...所有这些 类 的 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);
}
}
doStuff()
将始终 return 为真(除了 arg
等于 null
)。