Java 问题:T[]b=(T[])新对象[n];

Java 问题:T[]b=(T[])新对象[n];,java,generics,Java,Generics,类将编译,但当我使用整数数组从主类调用sort方法时,我得到: java.lang.ClassCastException:[Ljava.lang.Object;不能强制转换为[Ljava.lang.Compariable 我能做什么? 任何帮助都将非常感谢,如果我在任何地方错过了这个答案,我的歉意。我已经搜索了一天的大部分时间。谢谢!因为对象不能转换为T T[] b = (T[]) new Object[n]; 因此,这也不可能是真的 T b = (T) new Object(); 您可以查

类将编译,但当我使用整数数组从主类调用sort方法时,我得到:

java.lang.ClassCastException:[Ljava.lang.Object;不能强制转换为[Ljava.lang.Compariable

我能做什么?
任何帮助都将非常感谢,如果我在任何地方错过了这个答案,我的歉意。我已经搜索了一天的大部分时间。谢谢!

因为
对象不能转换为
T

T[] b = (T[]) new Object[n];
因此,这也不可能是真的

T b = (T) new Object();

您可以查看如何实现
集合。toArray(T[]a)
来创建类型为
T
的新数组,因为
对象不能强制转换为
T

T[] b = (T[]) new Object[n];
因此,这也不可能是真的

T b = (T) new Object();

您可以看看如何实现
Collection.toArray(T[]a)
来创建一个类型为
T

的新数组。简单的回答是,在Java中,数组和泛型不能很好地结合在一起

如您所知,Java泛型是使用类型擦除实现的,这意味着在编译时类型可能是
[]
,但在运行时类型会被擦除到其下限,在本例中是
可比[]
(使用原始类型)。
T[]
的类型实际上不会被擦除到
对象[]
除非这实际上是一般约束的下限

这样做的结果是,可以肯定地说:

T[] b = (T[]) new Object[n];
@SuppressWarnings(“未选中”)
T[]b=(T[])新可比[n];
一切都应该按照你的预期进行


请注意,如果您尝试混合使用数组和泛型,实际上还有很多需要注意的事项。例如,您可以通过使用泛型通配符(例如,
)来实现泛型的协方差和逆变。简而言之,在Java中,数组和泛型不能很好地结合在一起

如您所知,Java泛型是使用类型擦除实现的,这意味着在编译时类型可能是
[]
,但在运行时类型会被擦除到其下限,在本例中是
可比[]
(使用原始类型)。
T[]
的类型实际上不会被擦除到
对象[]
除非这实际上是一般约束的下限

这样做的结果是,可以肯定地说:

T[] b = (T[]) new Object[n];
@SuppressWarnings(“未选中”)
T[]b=(T[])新可比[n];
一切都应该按照你的预期进行


请注意,如果您尝试混合使用数组和泛型,实际上还有很多需要注意的事项。例如,您可以通过使用泛型通配符来实现泛型的协方差和逆变换(例如,
我没有投反对票,但我认为你的推理不正确。在许多情况下,从
对象
t
的强制转换在编译时是完全合法的(尽管它会生成未经检查的转换警告),但会在运行时出现
ClassCastException
而失败。但这与OP面临的实际问题无关,这与参数化类型和数组之间的二分法有关。我同意你的看法,Daniel和unchecked警告是我所期望的,而不是我得到的异常。感谢Nr9e help。@Nr9:你是对的,它在形式上是不正确的。但只要它在T的范围内,它就不会崩溃。所以在实践中,使用它是可以的。我没有否决,但我认为你的推理是不正确的。在许多情况下,从
对象
T
的转换在编译时是完全合法的(尽管它应生成未经检查的转换警告),但会在运行时出现
ClassCastException
而失败。但这与OP面临的实际问题无关,这与参数化类型和数组之间的二分法有关。我同意你的看法,Daniel和unchecked警告是我所期望的,而不是我得到的异常。感谢Nr9e help。@Nr9:你是对的,它在形式上是不正确的。但只要它在T的范围内,它就不会崩溃。所以在实践中,使用它是可以的。非常感谢。编写迭代合并排序并不太糟糕,但这个问题让我非常沮丧。请小心,再次感谢!非常感谢。编写迭代合并排序erge sort还算不错,但这一问题让我非常沮丧。请小心,再次感谢!一定要接受Daniel的回答。它促进了问题的进一步回答,也给了你一些业力!一定要接受Daniel的回答。它促进了问题的进一步回答,也给了你一些业力!