私は、ジェネリックに特にJavaのドキュメントを読んでいます。このページ有界なタイプのを、失われています。ここに私のコードのシンプルなバージョンは、私は一般的に比較可能なキーと1たい文脈のために、であるInteger
と、別の抽象クラスをDate
、ここだけの基本抽象クラスと整数の実装は次のとおりです。
抽象クラス:
public abstract class A<K extends Comparable<K>, V> extends TreeMap<K, V>
整数抽象クラス:
public abstract class B<K extends Integer, V> extends A<K,V>
私が手にエラーが一部に第二のクラスの型参照ですextends A<K,V>
。具体的には、私のIDEは、Kの基礎となると言うていますType parameter 'K' is not within its bound; should implement 'java.lang.Comparable<K>'
私は、理由の定義でこれに混乱していますInteger
、それは実装し、Comparable<Integer>
十分にこれを満たすことはないということですか?私は次の手順を実行しようとすると、また、public abstract class B<K extends Integer & Comparable<K>, V> extends A<K,V>
、それはどちらか動作しません。
ジェネリックで何かを誤解アムI?
コンパイルエラーがあるがために発生Date
道具はComparable<Date>
、サブクラスのDate
かもしれない実装されていませComparable<SubclassOfDate>
ので、コンパイラは文句を言います。
あなたは、変更することでこの問題を解決することができA
、ワイルドカードを使用することの宣言を:
public abstract class A<K extends Comparable<? super K>, V> extends TreeMap<K, V>
しかし、あなたはおそらく宣言することを意図しB
、このように:
public abstract class B<V> extends A<Integer,V> {
}
Integer
でfinal
、他のクラスは、それを継承することはできません。だから、B
ジェネリックである必要はありませんK
。
クラスについてはDate
キーとして、あなたはおそらくも、このようにそれをやってみたいです。
public abstract class C<V> extends A<Date,V> {
}
以来、しかし、Date
ではないfinal
、あなたは可能性があり、一般的なパラメータを作りますK extends Date
:
public abstract class C<K extends Date, V> extends A<K,V> {
}