我在Java中有一个泛型类:
public class PriorityList<T extends Number> implements Comparable<T> {
T[] array = (T[]) new Object[10];我有个错误
java.lang.ClassCastException:[Ljava.lang.Object;不能转换为[Ljava.lang.Number];
此铸造(T[])新Object10产生错误。
我需要比较方法,因为我需要对数组元素进行排序。所以我不能这样宣布课程
public class PriorityList<T extends Number> 其他有意义的选项是通过我自己的链接列表来保持T值的。但是是另一种解决铸造问题的方法
(T[]) new Object[10];禁止使用PS收藏。
发布于 2013-04-25 01:54:32
T的擦除是数字,所以:
Number[] array = new Number[10];会让你离得够近的。可以将数字的任何子类(例如,任何T)存储在该数组中。(注意:这也解释了为什么转换为(T[])new Object[10] aka (Number[])new Object[10]会导致异常。)
发布于 2013-04-24 18:22:36
不能将Object数组转换为Number数组,因为Object数组可以包含任何类型的对象--而不仅仅是T类型。但是,由于类型为errasure,new T[]是不正确的--也就是说,java运行时不知道T。
一种方法是使a成为一个Object[]数组。
另一种方式是:
public PriorityList(Class<T> type) {
T[] a = (T[])Array.newInstance(type, 10);
}或者,如前所述--使用Java集合--它们更泛型友好。
发布于 2013-04-24 18:22:36
不能将保留数组强制转换为未知类型数组。我建议您以这种方式为T对象使用数组工厂:
public interface ArrayFactory<T extends Number> {
T[] create(int size);
}
public class PriorityList<T extends Number> implements Comparable<T> {
private ArrayFactory<T> factory=...;
T[] array = factory.create(10);然后,您可以将ArrayFactory的实现提供给PriorityList。
希望这能有所帮助。
https://stackoverflow.com/questions/16199287
复制相似问题