无法将抽象对象的扩展对象传递给以抽象对象作为参数的方法

Cannot pass Object which extend of a abstract one into a Method with the abstract Object as Parameter

方法代码如下:

public void setupList(ArrayList<AnyAbstractObject> list)
{
     //Here´s the Code stuff. This Method is in the Class: AlphabeticList
}

我尝试用以下方法调用此方法:

setUpList(new ArrayList<THEObject>);

对象代码:

public class THEObject extends AnyAbstractObject{//Lalala}

当我尝试运行这个程序时,控制台打印如下:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method setupList(AnyAbstractObject[]) in the type AlphabeticList is not applicable for the arguments (AlphabeticList)

at Test.Tester.main(Tester.java:22)

这里有什么问题?

ArrayList<THEObject> 不是 ArrayList<AnyAbstractObject>,尽管 THEObjectAnyAbstractObject。重点是:

每只猫都是动物。每个“满是猫​​的房间”都是“满是动物的房间”吗?

乍一看,似乎是这样。但事实并非如此。有些事情你绝对可以用一个来做,但不能用另一个。例如,您可以从“满是猫​​的房间”中随机挑选一个人并拥抱它。但这不是你可以安全地使用“满是动物的房间”(当心虫子、鳄鱼等...)

在 Java 中,我们会有 class 层级 public class Cat extends Animal。而"do stuff with"是应用方法。

虽然您知道从 ArrayList<Cat> 中提取的每个元素都是 Cat:

 ArrayList<Cat> roomFullOfCats = getKittens();
 Cat tom = roomFullOfCats.get(42);

你不能指望从 ArrayList<Animal> 中取出的单个元素是 Cat

 ArrayList<Animal> roomFullOfAnimals = getAnimals();
 Animal jerry = roomFullOfAnimals.get(0); // <-- perfectly legal
 Cat tom = roomFullOfAnimals.get(42); //  <-- fails

这些是泛型编程的拖鞋,Java Tutorial chapter on Generic Programming 优雅地覆盖了它们。

setupList 和 setUpList 不是同一种方法。 Java 区分大小写。