Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java类转换异常泛型_Java_Class_Generics_Casting_Priority Queue - Fatal编程技术网

Java类转换异常泛型

Java类转换异常泛型,java,class,generics,casting,priority-queue,Java,Class,Generics,Casting,Priority Queue,我试图在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; }

我试图在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) 
对象[]不扩展任务[]。也就是说,任何对象的数组都不是任务的数组,相反才是真的

您必须创建任务数组:

或者,为避免未选中强制转换,请列出任务列表:

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

您正在将对象数组强制转换为任务数组。无法执行此操作,因为对象[]不是任务[]的实例。为什么不首先创建一个任务数组呢?您可以共享您得到的异常吗?请参见“是”,使用一个列表,或者更好地使用一个LinkedList,您可以在O1时间内从中获取尾部元素。泛型和数组不能很好地结合在一起。@Bohemian ArrayList几乎在所有情况下都胜过LinkedList。即使是理论上应该在实践中更快的事情也不是。ArrayList和ArrayQue应为默认值。在这种特殊情况下,堆实现将需要随机访问,因此ArrayList是一个明确的选择。
List<Task<E,T>> tasks = new ArrayList<>();