gpt4 book ai didi

java - 通用对象数组,其中通用对象的上限与 Object 不同

转载 作者:搜寻专家 更新时间:2023-11-01 02:43:28 25 4
gpt4 key购买 nike

谁能解释一下下面的场景是怎么回事?为什么一个报错,一个不报错?

public class TestClass<T extends Comparable<T>> {
protected T []items;

public TestClass(int size, T... values) {
items = (T[]) new Object[size];
for (int v = 0; v < Math.min(size, values.length); v++) {
items[v] = values[v];
}
}

public T getItem() {
return items[0];
}

public static void main(String []args) {
System.out.println(new TestClass<>(2, 6).getItem()); // Error
}
}

执行上面的类会出现如下错误:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable;
at TestClass.<init>(TestClass.java:5)
at TestClass.main(TestClass.java:16)
Java Result: 1

还有这个:

public class TestClass<T> {
protected T []items;

public TestClass(int size, T... values) {
items = (T[]) new Object[size];
for (int v = 0; v < Math.min(size, values.length); v++) {
items[v] = values[v];
}
}

public T getItem() {
return items[0];
}

public static void main(String []args) {
System.out.println(new TestClass<>(2, 6).getItem()); // Prints 6
}
}

我还应该提到,数组的创建是在父类(super class)中完成的,因此我无法更改数组初始化的完成方式。这也是在 Java 8 下编译的


我采用的解决方案是:this.items = (T[])new Comparable[size];

以上仅在您不尝试在类外使用数组时才有效。例如,这样做是错误的:

TestClass<Integer> t = new TestClass<>(2, 6);
System.out.println(t.items[0]); // error more ClassCastException

但这样做不是:

System.out.println(new TestClass<>(2, 6).getItem()); // Prints 6

还有其他人觉得 java 泛型类型有点不一致吗?

最佳答案

我相信你的问题出在这里

items = (T[]) new Object[size];

类 Object[] 不扩展 Comparable(或与此相关的任何接口(interface)),因此,你不能说 Comparable c = (Comparable)(new Object()),你也不能将 Object[] 转换为 Comparable[],如果它最初不是一个的话。

关于java - 通用对象数组,其中通用对象的上限与 Object 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28204995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com