首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免由可比接口生成的强制转换错误

如何避免由可比接口生成的强制转换错误
EN

Stack Overflow用户
提问于 2013-04-24 18:13:35
回答 4查看 204关注 0票数 1

我在Java中有一个泛型类:

代码语言:javascript
复制
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产生错误。

我需要比较方法,因为我需要对数组元素进行排序。所以我不能这样宣布课程

代码语言:javascript
复制
public class PriorityList<T extends Number> 

其他有意义的选项是通过我自己的链接列表来保持T值的。但是是另一种解决铸造问题的方法

代码语言:javascript
复制
(T[]) new Object[10];

禁止使用PS收藏。

EN

回答 4

Stack Overflow用户

发布于 2013-04-25 01:54:32

T的擦除是数字,所以:

代码语言:javascript
复制
Number[] array = new Number[10];

会让你离得够近的。可以将数字的任何子类(例如,任何T)存储在该数组中。(注意:这也解释了为什么转换为(T[])new Object[10] aka (Number[])new Object[10]会导致异常。)

票数 1
EN

Stack Overflow用户

发布于 2013-04-24 18:22:36

不能将Object数组转换为Number数组,因为Object数组可以包含任何类型的对象--而不仅仅是T类型。但是,由于类型为errasure,new T[]是不正确的--也就是说,java运行时不知道T

一种方法是使a成为一个Object[]数组。

另一种方式是:

代码语言:javascript
复制
public PriorityList(Class<T> type) {
    T[] a = (T[])Array.newInstance(type, 10);
}

或者,如前所述--使用Java集合--它们更泛型友好。

票数 0
EN

Stack Overflow用户

发布于 2013-04-24 18:22:36

不能将保留数组强制转换为未知类型数组。我建议您以这种方式为T对象使用数组工厂:

代码语言:javascript
复制
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。

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16199287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档