我有一个超类A,以及扩展A的类B,C和D.
class A {}
class B extends A {}
class C extends A {}
class D extends A {}
然后我有一个这样的列表:
[B.class, C.class, D.class]
我从列表中取一个随机项并像这样实例化它:
Object obj = list.get(i).newInstance()
现在我需要将obj传递给一个接受A类对象作为参数的方法。
A a = (A) obj
导致java抛出异常(InstantiationException或IllegalAccessException,我不知道因为android studio不会在catch中的断点处停止,并且任何尝试从catch中保存有关异常的信息都会导致null。 )。
我明白为什么我不能动态指定新的对象类型然后将obj强制转换为该类型,但是如果它们都共享公共父级,我不明白为什么它不起作用。
任何人都可以告诉我如何解决我目前正在做的事情,或以类似的方式达到同样的目的吗?
谢谢! /最大
答案 0 :(得分:6)
newInstance方法可以抛出InstantiationException或IllegalAccessException,因此如果此调用未包含在try / catch中,则可能会在IDE中看到警告。你的简单例子似乎工作正常。
class A {}
class B extends A {}
class C extends A {}
public class Test {
public static void main(String[] args) throws Exception {
List<Class> list = new LinkedList<Class>();
list.add(B.class);
list.add(C.class);
Object obj = list.get(0).newInstance();
A a = (A) obj;
System.out.println(a instanceof B);
}
}
打印“true”
答案 1 :(得分:2)
最后这是由于android studio的一个错误。重写代码修复了问题,我无法重现此问题
未来搜索者可能会觉得有用的其他症状:
Exception ex = null;
try {
// do something that raises an exception
ex = new Exception();
} catch (Exception ex) {
ex = ex;
}
// ex == null
正如其他答案所指出的那样,我在问题中描述的内容通常不会引起异常。
答案 2 :(得分:1)
代码似乎工作得很好。我不理解你的问题。
package testplayground;
import java.util.ArrayList;
import java.util.List;
class A {
void print() {
System.out.println("inside A");
}
}
class B extends A {
public void print() {
System.out.println("inside B");
}
}
class C extends A {
public void print() {
System.out.println("inside C");
}
}
class D extends A {
public void print() {
System.out.println("inside D");
}
}
public class TestPlayGround {
public static void main(String[] args) {
try {
List<Class> list = new ArrayList<Class>();
list.add(B.class);
list.add(C.class);
list.add(D.class);
for (Class classObj : list) {
Object obj = classObj.newInstance();
A a = (A) obj;
methodA(a);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static void methodA(A a) {
a.print();
}
}
输出: -
在B里面
内部C
在D
内