我无法理解为什么以下不起作用,我确信答案与我不理解的基本相关,并希望有人可以提供帮助.
我理解如何使用接口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一个接口作为泛型类型,为什么不能在最后一个语句中传入一个数组的刀具列表?
我今天正在阅读一些代码并看到了这个:
x.add(getResources().getString(R.string.none));
x.add(getResources().getString(R.string.today));
x.add(getResources().getString(R.string.tomorrow));
...
Run Code Online (Sandbox Code Playgroud)
所以我想,"那效率很低!" 并开始将其更改为:
Resources res = getResources();
x.add(res.getString(R.string.none));
x.add(res.getString(R.string.today));
x.add(res.getString(R.string.tomorrow));
...
Run Code Online (Sandbox Code Playgroud)
但后来我停下来想知道:代码的第二部分是否真的更有效率还是不重要?编译器是否会以任何方式生成相同的字节代码?