3

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

以下のように 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
    }

}

以下のように string または int 型の person をインスタンス化しようとしましたが、エラーはスローされません。

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

よく調べてみると、次の警告が表示されました。「型パラメータ Man は型 Man を隠しています」

したがって、クラス Person に型パラメーターとして Man を与えることは、Java の例で「E」を与えることと同じくらい良いことを理解しています。Man.class ではありません。なぜこれが起こったのですか?Man.class をジェネリック型パラメーターとして割り当てるにはどうすればよいですか?

ジェネリックを学ぶための良い質問/練習問題を私に投げてくれませんか。

4

1 に答える 1

5

Man同じパッケージ内のクラスの名前であるためです。ジェネリックの名前をPerson<Man>toPerson<T>またはMan他のクラスに似ていないものに変更するだけです。

ジェネリックの詳細:


ジェネリックを使用した属性Personのみが必要なようです。ジェネリックを定義し、使用するクラスとして使用することを定義して継承するManスーパークラスが必要です。短い例:PersonMan

public abstract class AliveBeing<T> {
    protected T livingBeing;
    public AliveBeing(T livingBeing) {
        this.livingBeing = livingBeing;
    }
}

public class Person extends AliveBeing<Man> {
    //now your livingBeing field is from Man type...
    public Person(Man man) {
        super(man);
    }
}

これでうまくいきますが、IMO このデザインは奇妙です。より適切で正確な回答を得るには、現在の問題について詳しく説明することをお勧めします。

違いに注意してください。

//case 1
public class Foo<T> {
    //...
}

//case 2
public class Bar<E> extends Foo<E> {
    //...
}

//case 3
public class Baz extends Foo<String> {
    //...
}

最初のケースでFooは、ジェネリック クラスを使用し、このクラスを で参照できますT。2 番目のケースでは、 は独自のジェネリック クラスを使用してBar拡張および宣言し、 で参照できますが、これは from で使用されるのと同じジェネリックになります(代わりにになります)。3 番目のケースでは、class は from を拡張しますが、ジェネリックな動作を定義せず、代わりに from で使用されるジェネリック クラスが であることを宣言します。FooEEFooTEBazFooFooString

于 2013-11-04T05:05:25.610 に答える