1

如果我正确理解了泛型,则声明为参数的方法<? super T>将接受任何类型T的引用或T. 我正在尝试使用以下代码对此进行测试,但编译器不喜欢它。

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>,而 Animal 是 Dog 的超级类型。

谢谢

4

3 回答 3

4

您正在尝试将 type 的表达式传递给 typeList<>的参数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 泛型的不错的文档/介绍

于 2011-12-07T15:34:56.197 回答