如何用Java编写支持比较和算术运算的泛型方法
我想用java编写一个通用方法,如下所示:
public <T extends Number & Comparable<T>> void test(T[] a){
T b=a[0];
if(a[0]>0){
a[0]*=a[0];
b+=a[1];
}
}
然后,我可以为该方法提供Integer[]
或Double[]
或其他Number
子类型。但我在上面尝试的代码给了我错误
请帮帮我。谢谢
# 1 楼答案
你有
Comparable
,所以如果我们有一个zero
,a[0]>0
可以被a[0].compareTo(zero) > 0
取代(不,我想是< 0
,我永远记不起来)。但是现在我们已经用完了Double
之类的有用的东西如果
Double
和朋友不java.lang.Comparable
,我们可以提供我们自己的java.util.Comparator
。也就是说,我们将比较的实现置于数据对象之外。我们也可以做加法和乘法注意,对于
Short
这样的事情,将其中两个相加将得到一个int
(通常的堆栈溢出免责声明:与其说是尝试编译代码,不如说是尝试编译代码。)
# 2 楼答案
在Java中不能用泛型实现这一点。这是C++的一个好处。p>
在某种程度上,您可以将其定义为“奇怪”,因为在Java的原始包装器上使用操作符是可能的。但这是因为不能在
java.lang.Number
上使用运算符,这是基本包装器的超类一些资源:
# 3 楼答案
除原语外的所有类型(包括推断的泛型类型)都是不支持算术运算的对象(包装器类使用装箱/拆箱来获得已知的psuedo行为)
类型擦除使编译后的代码使用强制转换来获得正确的行为(即,在运行时,JVM不知道传递了什么类型,需要知道哪些类型才能获得正确的装箱/取消装箱行为)
唯一(真正的)解决方案是为您想要支持的所有原语提供实现