【问题标题】:Adding object/class to a list with a different type将对象/类添加到具有不同类型的列表中
【发布时间】:2013-11-13 18:16:05
【问题描述】:

基本上,我想知道是否可以在 Java 中执行以下操作:

public static ArrayList<Script> scripts = new ArrayList<Script>();
scripts.add(new TestScript()); //TestScript extends Script class.

我尝试了一些不同的类型转换,并询问了我的一些朋友。似乎没有人有答案。但我知道这是可能的……也许吧?如果是这样,我该如何进行上述工作?如果没有,我还能做些什么来获得相同的效果?

【问题讨论】:

  • 你试过运行你的代码吗?为什么要问我们是否有效?

标签: java list class object arraylist


【解决方案1】:

TestScript 应该是Script 的子类。对象的集合可以包含同一类及其所有子类的对象。

不需要强制转换,因为 TestScript 在逻辑上是从 Script 扩展而来的 Script。

【讨论】:

  • 问题中已经提到,TestScript 扩展了 Script。参见他的代码 sn-p 的第 2 行。
  • 问题可能是在元素上调用TestScript 方法。
  • 没错。我的 TestScript 扩展了 Script,理论上它应该可以工作,但不能。可以做些什么吗,我上面的脚本,即“ScriptManager”在一个子文件夹中,但 TestScript 在根目录中?
【解决方案2】:

你的声明应该是ArrayList&lt;? super Script&gt;

【讨论】:

  • 我不会说应该
  • Masud:不,这行不通。试试吧。添加TestScript 实例不起作用,因为它可能是ArrayList&lt;FooScript&gt;,其中FooScript 扩展Script不是 TestScript
【解决方案3】:

是的,这会起作用。您将执行以下操作:

public static ArrayList<Script> scripts = new ArrayList<Script>();
scripts.add(new TestScript()); //TestScript extends Script class.

并遍历,

for( Script scr : scripts){
    scr.someMethodOfScript(); //no testscript methods available
    if(scr instanceof TestScript){
        TestScript tscr = (TestScript) scr;
        //call TestScript methods on tscr
    }
}

对于 Script 中不可用的任何 TestScript 方法,您都需要一个 instanceof 和一个 cast。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多