簡體   English   中英

Java泛型-超類型參考

[英]Java generics - Supertype references

如果我正確理解了泛型,則可以使用參數聲明為<? super T>的方法<? super T> <? 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的超級類型。

謝謝

您試圖將類型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>();

您是否嘗試過<? extends Dog> <? extends Dog>

還可以問為什么您使用ArrayList<? super 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;
}
}

可以在這里找到有關Java泛型的不錯的文檔/簡介。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM