5

私は、同等のものを格納する汎用Javaクラスを持っています:

public class MyGenericStorage<T extends Comparable<T>> {
    private T value;

    public MyGenericStorage(T value) {
        this.value = value;
    }

    //... methods that use T.compareTo()
}

Person という抽象クラスもあります。

public abstract class Person implements Comparable<Person>

および 2 つの具象サブクラス、Professor と Student:

public class Professor extends Person
public class Student extends Person

このように MyGenericStorage を作成しようとすると、エラーが発生します。

//error: type argument Student is not within bounds of type-variable T
MyGenericStorage<Student> studStore = new MyGenericStorage<Student>(new Student());

//this works: 
MyGenericStorage<Person> persStore = new MyGenericStorage<Person>(new Student());

これは、ジェネリックの理解に根本的な問題があるためだと思います。誰かが私にこれを説明できますか、また、それを修正する方法はありますか?

編集:

MyGenericStorage を次のように変更しました。

public class MyGenericStorage<T extends Comparable<? super T>> 

そして今、それはうまくいくようです。誰かが理由を説明できますか?

4

3 に答える 3

6

これは、MyGenericStorage の次の宣言で修正できます。

class MyGenericStorage<T extends Comparable<? super T>> { …

これは、のスーパータイプを受け入れる実装がT必要であることを意味します。andの場合、バインドされた ( ) で表されるスーパータイプは です。ComparableTStudentProfessor?Person


更新:「今はうまくいっているようです。誰かが理由を説明できますか?」

さて、私は元の答えを試しましたが、もう一度試してみましょう。

? super T「T の何らかのスーパータイプ」を意味します。Tこの場合は Student であるとします。したがって、Student は「Student のスーパータイプに対して」 Comparable を実装する必要があります。

StudentextendsPersonを実装しComparable<Person>ます。したがって、 Student は実際に「 Student のスーパータイプに対して」 Comparable を実装しています。

Java Generics について質問がある場合は、Angelika Langer の FAQ から始めるのが最適です。この場合、限定されたワイルドカードに関するエントリが役立つ場合があります。

于 2011-11-29T18:13:33.217 に答える
5

あなたの問題はPersonextendsComparable<Person>であるため、問題ありませんが、StudentPerson を拡張するため、拡張しComparable<Person>ませんComparable<Student>

あなたの制約では、あなたが言っているので、それらはまったく同じタイプ<T extends Comparable<T>>でなければなりません。派生型は使用できません

于 2011-11-29T17:57:55.313 に答える
1
public class MyGenericStorage<T extends Comparable<T>>

上記では、それ自体と比較できないクラスを拡張するために、ジェネリッククラスに指定された型が必要です。要するに、あなたはそれPersonを実装しなければならないComparable<Student>と言っているのですComparable<Professor>。そのため使用できません。

于 2011-11-29T18:01:06.220 に答える