有没有办法将动物添加到笼子里? :)

public class Cage<T> extends ArrayList<T> {
    public final String name = "foo";
}




public Zoo {
    List<? extends Cage<?>> zooCages= new ArrayList<Cage<?>>();

    public <T> void addAnimal(String name, T animal){
           for(Cage<?> c : zooCages)
               if(c.name.equals(name)){
                  c.add(animal);       //compile error
                  return;
               }
     }
}


编辑:错别字。
编辑2:完成示例

最佳答案

您的问题是使用无界通配符。请参见以下示例:

Cage<?> cage1 = new Cage<Integer>();
Cage<?> cage2 = new Cage<String>();
Cage<?> cage3 = new Cage<T>();

someMethod(cage1);
someMethod(cage2);
someMethod(cage3);

public void someMethod(Cage<?> cage) {
  cage.add(1);                // Will not compile
  cage.add("A String");       // Will not compile
  cage.add(someValueOfTypeT); // Will not compile
}


从技术上讲,该方法不是严格必需的,但是您可以轻松地看到此代码的问题。 Cage<?>可以是Cage<String>Cage<Anything>。您不能添加任何东西,因为它可以是任何特定的笼子。

如果要将T添加到Cage,则必须是Cage<T>Cage<? super T>。一种方法是:

public class Zoo<T> {
  private List<? extends Cage<? super T>> cages = new ArrayList<>();

  public void addAnimal(String cageName, T animal) {
    for(Cage<? super T> cage : cages) {
      // Now you can add animal to a cage
    }
  }
}

07-26 03:52