【问题标题】:Cannot pass Object which extend of a abstract one into a Method with the abstract Object as Parameter无法将扩展抽象对象的对象传递给以抽象对象作为参数的方法
【发布时间】:2016-10-03 18:07:34
【问题描述】:

这是方法的代码:

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}

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

线程“main”java.lang.Error 中的异常:未解决的编译问题:
AlphabeticList 类型中的 setupList(AnyAbstractObject[]) 方法不适用于参数 (AlphabeticList)

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

这里有什么问题?

【问题讨论】:

  • 有几个问题。忘记类型,为什么在请求数组时传递列表。
  • [] 与 ArrayList 不同。
  • @Bruno 你可以将鼠标悬停在投票按钮上以了解他们的目的。
  • 我正在考虑这一点。
  • 那不是我的源代码...我在复制方法时出错了,我更正了它,抱歉 :)

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


【解决方案1】:

ArrayList&lt;THEObject&gt; 不是ArrayList&lt;AnyAbstractObject&gt;,即使THEObject 是AnyAbstractObject。关键是:

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

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

在 Java 中,我们将拥有类层次结构public class Cat extends Animal。而“do stuff with”就是应用一个方法。

虽然您知道从 ArrayList&lt;Cat&gt; 获取的每个单独元素都是 Cat:

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

你不能指望你从 ArrayList&lt;Animal&gt; 获取的单个元素是 Cat

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2022-12-17
      • 2012-11-27
      • 2020-06-05
      • 1970-01-01
      • 2016-06-28
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多