0

私はジェネリックを実践しており、次のことを行いました。

以下のように man というクラスを作成しました。

public class Man {
    int hands=2;
    int legs=2;
    boolean alive;

    public Man(boolean b) {
        // TODO Auto-generated constructor stub
        alive=b;
    }
}

person というクラスを作成しました

public class Person<Man> {
    Man p;
    String name;


    public Person(Man p, String name) {
        this.p = p;
        this.name = name;
    }

    public Person() {
        // TODO Auto-generated constructor stub
    }

}

以下のように type または int の person をインスタンス化しようとしましStringたが、スローされず、エラーが発生しました。

Person<String> p1 = new Person<String>(new String("test"), "test1");
Person<Integer> p2=new Person<>(1,"test");

今、私はクラスの署名をに変更しました

 public class Person<T extends Man>{} 

そして、タイプの人物を作成することはできなくなりましたString。なぜこれが起こったのですか?person クラスを、Man のサブクラスであるミュータントではなく、厳密に Man にしたい..どうすればよいですか?

私も以下をやってみました

public abstract class AliveBeing<T>{}

AliveBeing を のスーパークラスにManしてから試しました

public class Person<Man> extends AliveBeing<Man>{}

現在でも、Manin にPerson<Man>はその下に黄色い線があり (型パラメーター Man は type を隠していますMan)、 AliveBeing の Man にはありません。

Manコンパイラがinについてのみ混乱するのはなぜPerson<Man>ですか?

4

1 に答える 1

1

OK、そこには約 4 つの異なる質問がありますが、試してみます。

今、私はクラスの署名をに変更しました

public class Person<T extends Man>{}

そして、文字列型の人を作成できなくなりました。なぜこれが起こったのですか?

書き込みにより、 person へPerson<T extends Man>の型パラメーターTを拡張する必要があることを指定したためですMan(これにより、 になることもできますMan)。したがって、 ifMilkmanおよびPostmanall extends 、Manthenおよびはすべて有効な型ですが、は extendsではないため、そうではありません。Person<Milkman>Person<Postman>Person<Man>Person<String>StringMan

public class Person<Man> extends AliveBeing<Man>{}

コンパイラがマン・イン・パーソンについてのみ混乱しているのはなぜですか?

この宣言では、Manほとんどの人が使用する方法を使用しているため、TつまりE、実際のクラスではなく型パラメーターです。任意の型に置き換えることができるジェネリックPersonクラスを作成しています。Man

コンパイラの警告は、これを行うことにより、 class の実際の定義をマスクしていることを示しています。これは現在、ジェネリック クラス定義Man内では使用できません。Personコンパイラが警告しているのは、これが意図したものではないことはほぼ確実です。

于 2013-11-06T20:43:55.777 に答える