【发布时间】:2017-01-19 16:28:45
【问题描述】:
我刚刚看到一个 Java 泛型教程,它似乎使用原始 int、float 等作为扩展 Comparable 的对象
public class MaximumTest {
// determines the largest of three Comparable objects
public static <T extends Comparable<T>> T maximum(T x, T y, T z) {
T max = x; // assume x is initially the largest
if(y.compareTo(max) > 0) {
max = y; // y is the largest so far
}
if(z.compareTo(max) > 0) {
max = z; // z is the largest now
}
return max; // returns the largest object
}
public static void main(String args[]) {
System.out.printf("Max of %d, %d and %d is %d\n\n",
3, 4, 5, maximum( 3, 4, 5 ));
System.out.printf("Max of %.1f,%.1f and %.1f is %.1f\n\n",
6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ));
System.out.printf("Max of %s, %s and %s is %s\n","pear",
"apple", "orange", maximum("pear", "apple", "orange"));
}
}
原语可以以某种方式成为 Comparable 对象吗?
【问题讨论】:
-
Autoboxing 是这里发生的事情 - 原始的
int值被装箱到java.lang.Integer对象中,并且实现了Comparable<Integer>。 -
自动装箱是您正在寻找的,在必要时在原始类型及其对应对象之间进行转换(例如
intInteger)。 -
它比单纯的自动装箱要复杂一些。就是这样加上重载决议的规则。
-
需要注意的是
T不能是原始类型,它始终是引用类型。因此,为了能够调用泛型方法,Java 必须将值装箱,这会自动发生。在第一个示例中为Integer,在下一个示例中为Double。