2011-12-07 120 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