小编Jer*_*ady的帖子

通用类型的ArrayList和接口继承问题

我无法理解为什么以下不起作用,我确信答案与我不理解的基本相关,并希望有人可以提供帮助.

我理解如何使用接口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一个接口作为泛型类型,为什么不能在最后一个语句中传入一个数组的刀具列表?

java generics collections types subclass

7
推荐指数
1
解决办法
2926
查看次数

声明一个局部变量并设置它比一次又一次地使用getter更有效吗?

我今天正在阅读一些代码并看到了这个:

    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)

但后来我停下来想知道:代码的第二部分是否真的更有效率还是不重要?编译器是否会以任何方式生成相同的字节代码?

java android

0
推荐指数
1
解决办法
248
查看次数

标签 统计

java ×2

android ×1

collections ×1

generics ×1

subclass ×1

types ×1