1

ジェネリックスを正しく理解している場合、として宣言されたパラメーターを持つメソッドは、Typeまたはスーパータイプの<? super T>いずれかの参照を受け入れます。次のコードでこれをテストしようとしていますが、コンパイラーはそれを好みません。TT

class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}

class ZiggyTest2{

    public static void main(String[] args){                 

        List<Animal> anim2 = new ArrayList<Animal>();
        anim2.add(new Animal());
        anim2.add(new Dog());
        anim2.add(new Cat());   

        testMethod(anim2);
    }

    public static void testMethod(ArrayList<? super Dog> anim){
        System.out.println("In TestMethod");
        anim.add(new Dog());
        //anim.add(new Animal());
    }
}

コンパイラエラーは:

ZiggyTest2.java:16: testMethod(java.util.ArrayList<? super Dog>) in ZiggyTest2 cannot be applied to (java.util.List<Animal>)
                testMethod(anim2);
                ^
1 error

<Animal>anim2はタイプであり、Animalはスーパータイプの犬であるため、なぜ私がanim2を渡せないのかわかりません。

ありがとう

4

3 に答える 3

4

List<>タイプの式をタイプのパラメータに渡そうとしていますArrayList<>。動作しません。

この行のどちらか

public static void testMethod(ArrayList<? super Dog> anim){

する必要があります

public static void testMethod(List<? super Dog> anim){

また

    List<Animal> anim2 = new ArrayList<Animal>();

する必要があります

    ArrayList<Animal> anim2 = new ArrayList<Animal>();
于 2011-12-07T15:24:19.120 に答える
1

試しました<? extends Dog>か?

また、なぜあなたがArrayList<? super Dog>単にではなく使用しているのか尋ねることができますArrayList<Animal>か?おそらく、この例はあなたがやろうとしていることの単なる単純な形ですが、それは不可解に複雑すぎるように見えます。

これはジェネリックの基本的な例です。それが役に立てば幸い。

class Animal{
public sleep(){}
}
class Dog extends Animal{
public sleep(){
    log("Dog sleeps");
}
}
class Rabbit extends Animal{
public sleep(){
    log("Rabbit sleeps");
}
}

class Place<T>{
T animal;
}
class Kennel extends Place<Dog>{
public Kennel(Dog dog){
    super();
    this.animal = dog;
}
}
class Hutch extends Place<Rabbit>{
public Kennel(Rabbit rabbit){
    super();
    this.animal = rabbit;
}
}
于 2011-12-07T15:31:15.903 に答える
0

Java Genericsに関する優れたドキュメント/紹介は、ここにあります。

于 2011-12-07T15:34:56.197 に答える