2016-08-14 65 views
-1

我试图创建一个优先级队列的任务在Java中,但我已经遇到了优先级队列的构造函数中的类转换异常。这是我的任务等级:Java类投射例外泛型

public class Task <E,T extends Integer> 
{ 
    private E job; 
    private T priority; 

    public Task(E job, T priority) 
    { 
     this.job = job; 
     this.priority = priority; 
    } 

    public String toString() 
    { 
     return "Job Name: "+ job + " Priority: "+priority; 
    } 
} 

错误被扔在优先级队列的构造函数的第二行:

public class PriorityQueueCustom <E,T extends Integer> 
{ 
    private Task<E,T>[] heap; 
    private int heapSize,capacity; 

public PriorityQueueCustom(int capacity) 
{ 
    this.capacity = capacity + 1;            
    heap = (Task<E,T>[]) new Object[capacity]; 
    heapSize = 0; 
} 

我不明白的是为什么我不能对象转换为任务自任务应自动扩展对象,但我是新来的泛型,所以我不知道如果我已经正确地设置它们?

这是我创建的优先级队列:

PriorityQueueCustom<String,Integer> queue = new PriorityQueueCustom<String,Integer>(10); 

这里是生成的异常:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [LPriorityQueueCustom$Task; 
at PriorityQueueCustom.<init>(PriorityQueueCustom.java:28) 
at PriorityQueueTester.main(PriorityQueueTester.java:5) 
+4

您是铸造Object'的'数组的'数组Task'。由于Object []不是Task []'的实例,因此无法完成此操作。为什么不首先创建一个“任务”数组? – johnnyaug

+0

你能分享你得到的异常吗? – Mureinik

+2

另请参阅http://stackoverflow.com/questions/529085/how-to-create-a-generic-array-in-java – 2016-08-14 16:52:49

回答

2

Object[]没有延伸Task[]。即任何对象的数组不是任务数组(只有相反的情况)。

你必须创建Task数组:

Task<E,T>[] a = new Task[capacity]; 

或者,以避免未经检查的演员阵容,任务列表:

List<Task<E,T>> tasks = new ArrayList<>(); 
+1

是的,使用List,或者甚至更好的LinkedList,您可以从中获取尾部元素在O(1)时间。泛型和数组在一起玩并不好。 – Bohemian

+0

@波希米亚ArrayList在几乎所有情况下都击败LinkedList。即使理论上在实践中应该更快的事情也不是。 ArrayList和ArrayDeque应该是默认的。在这种特殊情况下,堆实现需要随机访问,所以ArrayList是一个明确的选择。 –