2016-08-14 15 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; 
    } 
} 

エラーが優先キューのコンストラクタの2行目にスローされます:

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; 
} 

私は、オブジェクトをキャストすることはできませんなぜ私が理解していないことですタスクは自動的にオブジェクトを拡張する必要がありますが、ジェネリックスを初めて使用しているので、正しく設定したかどうかわかりません。

これは私がプライオリティキューを作成する方法である:

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

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

あるいは、未チェックのキャスト、タスクのリストを避けるためにタスク。 'Object []'は 'Task []'のインスタンスではないので、これはできません。最初に 'Task'の配列を作成してみませんか? – johnnyaug

+0

あなたは例外を共有できますか? – Mureinik

+2

も参照してください。http://stackoverflow.com/questions/529085/how-to-create-a-generic-array-in-java –

答えて

2

Object[]Task[]を拡張しません:

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

そしてここでは、生成された例外です。私。オブジェクトの配列はタスクの配列ではありません(逆の場合のみ)。

あなたはTask配列を作成する必要があります:あなたは `の配列に` Object`の配列をキャストしている

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

はい、Listを使用するか、より良いLinkedListを使用して、tail要素を取ることができますO(1)時間で。ジェネリックスと配列はうまく一緒に演奏されません。 – Bohemian

+0

@Bohemian ArrayListはほとんどすべての場合LinkedListを打ち負かします。理論的には実際に速くなければならないものでさえもそうではありません。 ArrayListとArrayDequeはデフォルトでなければなりません。この特定の場合、ヒープ実装ではランダムアクセスが必要になるため、ArrayListは明確な選択肢です。 –