Jer*_*ady 7 java generics collections types subclass
我无法理解为什么以下不起作用,我确信答案与我不理解的基本相关,并希望有人可以提供帮助.
我理解如何使用接口ArrayList,如果我有:
public interface Weapon { ... }
public class Gun implements Weapon { ...}
public class Knife implements Weapon { ... }
Run Code Online (Sandbox Code Playgroud)
然后,您可以将实施武器的任何东西插入到武器数组中:
ArrayList<Weapon> weapons = new ArrayList<Weapon>();
weapons.add(new Gun());
weapons.add(new Knife();
Run Code Online (Sandbox Code Playgroud)
我明白了,但令我困惑的是理解为什么ArrayList<Gun>与ArrayList<Weapon>其他方面不兼容.为了说明,以下是合法的:
public void interfaceIsTheArgument(Weapon w) { ... }
...
interfaceIsTheArgument(new Gun());
interfaceIsTheArgument(new Knife());
Run Code Online (Sandbox Code Playgroud)
但以下不是:
public void interfaceIsTheArgument(ArrayList<Weapon> w) { ... }
...
interfaceIsTheArgument(new ArrayList<Gun>());
interfaceIsTheArgument(new ArrayList<Knife>());
Run Code Online (Sandbox Code Playgroud)
因为最后一个函数调用报告该方法不适用于其参数.
我的问题是,如果方法知道它的任务是ArrayList一个接口作为泛型类型,为什么不能在最后一个语句中传入一个数组的刀具列表?
Boh*_*ian 13
要"修复"代码,您需要使用通用绑定:
public void interfaceIsTheArgument(List<? extends Weapon> w) { ... }
...
interfaceIsTheArgument(new ArrayList<? extends Weapon> ());
interfaceIsTheArgument(new ArrayList<Knife>());
Run Code Online (Sandbox Code Playgroud)
最关键的原因是List<Gun>是没有的子类List<Weapon>.这个事实的原因可以通过以下代码来说明:
List<Gun> guns = new ArrayList<Gun>();
// If List<Weapon> was a super type of List<Gun>, this next line would be allowed
List<Weapon> weapons = guns; // Won't compile, but let's assume it did
weapons.add(new Knife()); // Compiles, because Knife is a Weapon
Gun gun = guns.get(0); // Oops! guns.get(0) is a Knife, not a Gun!
Run Code Online (Sandbox Code Playgroud)
通过使用绑定<? extends Weapon>,我们说我们将接受任何属于它的子类的泛型类型Weapon.使用边界可能非常强大.这种绑定是一个上限 - 我们将顶级类指定为Weapon.
还有一个下限,它使用以下语法:
List<? super Weapon> // accept any type that is a Weapon or higher in the class hierarchy
Run Code Online (Sandbox Code Playgroud)
那么,何时使用每一个?记住这个词PECS:"制片人延伸,消费者超级".这意味着在代码的生产者端(创建对象的地方)使用extends,并且在代码的消费者端(使用对象的地方)使用我们super.一旦你尝试了几次,你将通过经验了解为什么它运作良好.
这个问题/答案很好地涵盖了它.
| 归档时间: |
|
| 查看次数: |
2926 次 |
| 最近记录: |