存储在ArrayList中的实例化类的访问方法

时间:2015-04-06 22:11:18

标签: processing

我是Java的初学者(我有JS背景),我试图在nature of code书的第1章末尾进行练习。

我要做的是生成一个实例列表。 我很难理解Java如何管理类和实例,所以请耐心等待。

我现在拥有的是什么:

  • 创建ArrayList
  • 从字符串列表中选择随机类名
  • 使用Class.forName,getConstructor和newInstance
  • 实例化该类
  • 将实例存储在ArrayList
  • 迭代ArrayList
  • 致电方法

以下是代码:

import java.util.*;
import java.lang.reflect.*;

List < Object > bugs = new ArrayList < Object > ();

String[] bugList = {
    "Bug",
        "Fly",
        "Bee"
};

void setup() {
    String currentClass;

    int bugLength = bugList.length;

    for (int i = 0; i < 20; i++) {
        int chosenClass = getRandNumber(0, bugLength - 1);
        currentClass = bugList[chosenClass];

        bugs.add(loadClass(currentClass));
    }
}

public Object loadClass(String chosenClass) {
    String className;

    Class <? > cl = null;
    Constructor[] cons = null;
    Object instance = null;

    className = this.getClass().getName() + "$";

    try {
        cl = Class.forName(className + chosenClass);
    } catch (ClassNotFoundException e) {
        //
    }

    try {
        cons = cl.getDeclaredConstructors();
    } catch (Exception e) {}

    try {
        instance = cons[0].newInstance(new Object[] {
            this
        });
    } catch (InstantiationException e) {
        //
    } catch (IllegalAccessException e) {
        //
    } catch (InvocationTargetException e) {
        //
    }


    return instance;
}

void draw() {
    for (int i = 0; i < bugs.size(); i++) {
        bugs.get(i).update();
    }
}

class Bug {
    // Snip

    public Bug() {
        // Snip
    }

    public void update() {
        // Snip
    }

    public void render() {
        // Snip
    }
}

class Fly extends Bug {
    public Fly() {
        // Snip
    }
}

class Bee extends Bug {
    public Bee() {
        // Snip
    }
}

问题出在draw函数中,因为我认为它试图访问名为&#34; update&#34;的方法。来自一个对象,而不是来自我的实例。

访问时是否有可能明确地将对象强制转换为正确的类型? 或者有没有办法存储不同的实例类型并直接命名?

或者,正如我在其他地方提到过某人的某些代码,我是否想要对Java过于动态?

1 个答案:

答案 0 :(得分:1)

您可以在调用Bug

之前将对象明确地转换为update

无论其

如果您知道bugs列表中的所有对象都是Bug的子类,那么您应该将List<Object> bugs更改为List<Bug> bugs。通过这种方式,您可以毫无问题地调用update()(如果将列表传递给其他代码区域,则其他代码可以将列表用作Bug s而不是对象的列表) 。为了完成这项工作,您必须在Bug内执行转换为loadClass()并返回Bug而不是Object的实例。