-4

我有一个超类 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 转换为该类型,但是如果它们都共享共同的父对象,我不明白为什么它不起作用。

任何人都可以启发我如何解决我目前正在做的事情,或者以类似的方式实现同​​样的事情吗?

谢谢!/最大限度

4

3 回答 3

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);

    }
}

打印“真实”

于 2013-08-28T22:13:07.993 回答
2

最后,这是由于 android studio 的一个错误。重写代码解决了这个问题,我无法重现这个问题

未来搜索者可能会发现有用的其他症状:

  • android studio 不会在 catch 块内的断点处停止
  • 任何尝试在 catch 中保存有关异常的信息都会导致 null(请参见下面的示例)

Exception ex = null;
try {
    // do something that raises an exception
    ex = new Exception();
} catch (Exception ex)  {
    ex = ex;
}
// ex == null

正如其他答案所指出的,我在问题中所描述的通常不会引发异常。

于 2013-09-06T12:49:07.010 回答
1

The code seems to be working absolutely fine. I am not understanding your question.

    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();
    }
}

output:-

inside B

inside C

inside D

于 2013-08-28T22:15:20.883 回答