5 Stimmen

Wie geht man mit "super" Generika in Java um?

Nehmen wir das folgende Beispiel für Generika

import java.util.List;
import java.util.ArrayList;

public class GenericsTest {
    private List<Animal> myList;

    public static void main(String args[]) {
        new GenericsTest(new ArrayList<Animal>()).add(new Dog());
    }

    public GenericsTest(List<Animal> list) {
        myList = list;
    }

    public void add(Animal a) {
      myList.add(a);
    }

    public interface Animal {}
    public static class Dog implements Animal {}
    public static class Cat implements Animal {}
}

Es funktioniert gut. Aber wie Sie wissen, können Sie es nicht mit

new GenericsTest(new ArrayList<Dog>());

denn, wie Sie wissen, würde das add(Animal) es ermöglichen, die Cat s. Die vorgeschlagen Lösung dieses Problems, d.h. Wildcarding, funktioniert auch nicht, denn man kann zwar jede List<Animal> sur List<? extends Animal> aber es hat das gleiche Problem: Sie können die GenericsTest con List<Cat> und fügen Sie dann Dog s.

Also meine Frage ist: gibt es eine bequeme Möglichkeit, diese Klasse einmal zu schreiben, und dann verwenden Sie es für alle möglichen Animals ? Natürlich sollte es das oben genannte Problem ohne Weiteres lösen.

6voto

Greg Cottman Punkte 658

Wenn ich verstehe, was Sie versuchen zu tun, dann müssen Sie den generischen Typ auf Klassenebene setzen:

public class GenericsTest<T extends Animal>
{
  private List<T> myList;

  public static void main(String args[])
  {
    new GenericsTest<Dog>(new ArrayList<Dog>());
  }

  public GenericsTest(List<T> list)
  {
    myList = list;
  }

  public void add(T a)
  {
    myList.add(a);
  }
}

2voto

Diastrophism Punkte 14352

Vielleicht möchten Sie die ganz Klasse generisch und nicht nur die Parameter:

import java.util.List;
import java.util.ArrayList;

public class GenericsTest<T extends Animal> {
    private final List<T> myList;

    public static void main(final String args[]) {
        new GenericsTest<Animal>(new ArrayList<Animal>()).add(new Dog());
        new GenericsTest<Dog>(new ArrayList<Dog>()).add(new Dog());
        new GenericsTest<Cat>(new ArrayList<Cat>()).add(new Cat());
    }

    public GenericsTest(final List<T> list) {
        myList = list;
    }

    public void add(final T a) {
      myList.add(a);
    }
}

// Can't nest as Animal needs to be in scope of class declaration
interface Animal {}
class Dog implements Animal {}
class Cat implements Animal {}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X