これは宿題です:
次のように定義されたジェネリック クラスがあります。
public class PriorityQueue<T extends Comparable<T>> {
ArrayList<T> queue;
public PriorityQueue(){
queue = new ArrayList<>();
}
void add(T t){
queue.add(t);
Collections.sort(queue);
}
<T extends Comparable<T>> T remove(){
T t = queue.get(0);
queue.remove(t);
return t;
}
}
しかし、NetBeans は行に次のエラー (赤い下線) を示していますT t = queue.get(0)
:
incompatible types
required: T#2
found: T#1
where T#1,T#2 are type-variables:
T#1 extends Comparable<T#1> declared in class PriorityQueue
T#2 extends Comparable<T#2> declared in method <T#2>remove()
T
メソッド宣言で参照している型が、クラスの型パラメータで参照されている型と同じであることが、どういうわけか理解されていないようです。これはある種の構文の問題だと思います。
私はまた、物事を複雑にしすぎているのではないかと思いますT remove() {
.. これは正しくコンパイルされますが、次のようにドライバー クラスを使用してテストしようとすると、次のようになります。
PriorityQueue pq = new PriorityQueue<Integer>();
int a = 10;
int b = 12;
int c = 5;
int d = 9;
pq.add(a);
pq.add(b);
pq.add(c);
pq.add(d);
Integer i = pq.remove();
エラーが発生します:
Incompatible types:
required: Integer
found: Comparable
ライン上Integer i = pq.remove();
おそらく明らかなように、私はジェネリックの使用方法を学んでいます。ここでどこが間違っているのかを理解してください。