我是Java的初学者(我有JS背景),我试图在nature of code书的第1章末尾进行练习。
我要做的是生成一个实例列表。 我很难理解Java如何管理类和实例,所以请耐心等待。
我现在拥有的是什么:
以下是代码:
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过于动态?
答案 0 :(得分:1)
您可以在调用Bug
update
无论其
如果您知道bugs
列表中的所有对象都是Bug
的子类,那么您应该将List<Object> bugs
更改为List<Bug> bugs
。通过这种方式,您可以毫无问题地调用update()
(如果将列表传递给其他代码区域,则其他代码可以将列表用作Bug
s而不是对象的列表) 。为了完成这项工作,您必须在Bug
内执行转换为loadClass()
并返回Bug
而不是Object
的实例。