2011-12-07 44 views
1

如果我已正确理解泛型,则声明为参数<? super T>的方法将接受任何类型为T或超类型T的引用。我试图用下面的代码来测试它,但编译器不喜欢它。Java泛型 - 超类型引用

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 

我不明白为什么我不能在anim2传递,因为它是<Animal>型和动物是一个超级类型的狗。

感谢

回答

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>(); 
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; 
} 
} 
+0

<?延伸Dog>不允许修改集合。 – ziggy

+0

它也不允许狗列表传递给测试方法。 –

0

关于Java泛型一个很好的文件/介绍可以发现here