像这样想,您有一个
Fruit调用
re(我使用此名称,因为它是您正在使用的变量的名称)。
Fruit re;
您有一个
reverse输入类型为的方法
Apple。
public Apple reverse(Apple a) { // ...}我们有一个
re声明为的变量,
Fruit这意味着我们要说它总是某种(
Fruit也许
Apple,但也许)
Orange-甚至
Banana。
当您尝试
Fruit将方法赋予方法时
Apple,编译器会停止运行,因为无法确定它是100%an
Apple。例如…
Fruit re = new Orange();reverse(re);
kes!可以这么说,我们正在将一个方形的钉子插入一个圆孔中。
reverse需要
Apple,不是
Orange。可能发生坏事!
旁注: 为什么可以那样分配
Apple给声明为Fruit那时的东西?(reverse返回anApple,Fruit f =reverse(re);是合法的。)因为anApple是
一个Fruit。如果将其声明为更具体,Apple而将返回类型声明为更一般Fruit, 则
此处将存在问题。(如果reverse返回Fruit,Apple a = reverse(re);将是非法的。)
如果你没有按照比喻,
替换
Fruit用
List,并
Apple与
ArrayList以上再次读取。
List是
Fruit,是描述抽象概念的一般方法。
ArrayList是
Apple,是抽象概念的特定实现。(
linkedList可能
Orange也是。)
通常,您希望将事物声明为可以获取所需功能的最通用事物。进行以下更改应该可以解决您的问题。
public List<Integer> reverse(List<Integer> list) {我们正在采取某种
List的
IntegerS和返回某种
List的
Integer秒。



