Javaのジェネリック - Typeパラメータ `K 'は、その結合内ではありません。Xを実装する必要があります

スティーブン・K:

私は、ジェネリックに特に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> {

}

Integerfinal、他のクラスは、それを継承することはできません。だから、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> {

}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=179384&siteId=1