我无法弄清楚这里发生了什么。我试图创建一个通用的max方法来处理各种数组类型,但我不知道我在哪里尝试将Integer转换为Box。我在这里很新,所以任何帮助都将不胜感激。
我可以做的一件事是保持最大值的Object max = 0
行。我选择了Object,因为它可以容纳任何东西(据我所知),但最初将它设置为0
并没有多大意义,但我无法想到任何其他方式工作。
编辑:还有一件事,当我用双打测试它时,它会抛出同样的错误,但是java.lang.Integer cannot be cast to java.lang.Double
但是这对我来说没有意义。我想在哪里投这些东西?它必须是max
?
这是我的代码:
包q3;
import java.util.Random;
public class Biggest {
public static Object max(Comparable[] x) {
Object max = 0;
for (int i = 0; i < x.length; i++) {
System.out.println("Comparing " + x[i] + " to " + max);
if (x[i].compareTo(max) > 0) {
max = x[i];
}
}
return max;
}
public static void main(String[] args) {
Integer[] ai = new Integer[10];
Double[] ad = new Double[10];
fillInts(ai);
fillDoubs(ad);
System.out.println("Max ints: " + max(ai));
//System.out.println("Max doubles: " + max(ad, ad.length));
///// boxes/////////
Box[] boxes = new Box[5];
fillBoxes(boxes);
System.out.println(max(boxes));
}
private static void fillBoxes(Box[] boxes) {
// random class for each of the dimension
Random a = new Random();
Random b = new Random();
Random c = new Random();
int l, w, h;
for (int i = 0; i < boxes.length; i++) {
l = a.nextInt(30);
w = b.nextInt(30);
h = c.nextInt(30);
boxes[i] = new Box(l, w, h);
}
}
private static void fillDoubs(Double[] ad) {
Random r = new Random();
for (int i = 0; i < ad.length; i++) {
ad[i] = 1.0 * r.nextDouble();
}
}
private static void fillInts(Integer[] ai) {
Random r = new Random();
for (int i = 0; i < ai.length; i++) {
ai[i] = r.nextInt(100);
}
}
}
答案 0 :(得分:0)
文字0
始终为int
类型,因此Object max = 0;
实际上由于自动装箱而隐式Object max = Integer.valueOf(0);
。这意味着max
始终以实际类型为Integer
的值开始。
例如,由于Double.compareTo
需要Double
参数,因此在向Integer
传递Comparable
时会引发异常。
为什么抛出一个类强制转换异常要解释起来有点复杂,但这是由于Java泛型的实现,这是通过type erasure。由于compareTo
是一个通用界面,当我们覆盖public final class Double implements Comparable<Double> {
// ...
// generated bridge method
public int compareTo(Object o) {
return compareTo((Double) o);
}
// method which java.lang.Double
// source code actually declares
@Override
public int compareTo(Double that) {
return compare(this.doubleValue(), that.doubleValue());
}
}
,the compiler generates something called a bridge method时,看起来像这样:
compareTo
当您在Comparable
上调用compareTo(Object)
时,它实际上会调用方法Double
,该方法尝试将参数转换为Double.compareTo(Double)
,然后将其传递给{{1} }}。它是桥接方法中的这种方法,它实际上抛出异常。
通常,您需要自己将零值传递给max方法,如下例所示(也使用泛型):
public static <T extends Comparable<T>> T max(T[] arr, T zero) {
T max = zero;
for (T e : arr)
if (e.compareTo(max) > 0)
max = e;
return max;
}
另一种方式是这样的:
public static <T extends Comparable<T>> Optional<T> max(T[] arr) {
if (arr.length == 0)
return Optional.empty();
T max = arr[0];
for (int i = 1; i < arr.length; ++i)
if (arr[i].compareTo(max) > 0)
max = arr[i];
return Optional.of(max);
}