Обобщения Java - ссылки на супертипы - PullRequest
1 голос
/ 07 декабря 2011

Если я правильно понял обобщенные значения, метод с параметрами, объявленными как <? 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.

Спасибо

Ответы [ 3 ]

4 голосов
/ 07 декабря 2011

Вы пытаетесь передать выражение типа 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 голос
/ 07 декабря 2011

Вы пробовали <? 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 голосов
/ 07 декабря 2011

Хороший документ / введение о Java Generics можно найти здесь

...