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

时间:2016-10-03 18:07:35

标签: java list generics generic-programming generic-collections

以下是方法代码:

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

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

setUpList(new ArrayList<THEObject>);

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)

这里有什么问题?

2 个答案:

答案 0 :(得分:4)

ArrayList<THEObject>不是ArrayList<AnyAbstractObject>,即使THEObjectAnyAbstractObject。这是一个问题:

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

起初看起来似乎如此。但事实并非如此。有一些东西你绝对可以用一个,但不能与另一个。例如,你可以从一个“充满猫的房间”中随机抽取一个人,然后拥抱它。但这不是你可以安全地用“充满动物的房间”做的事情(小心虫子,鳄鱼等......)

在Java中,我们将拥有类层次结构public class Cat extends Animal。而“做东西”就是应用一种方法。

虽然您知道从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优雅地涵盖了它们。

答案 1 :(得分:0)

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