Java类转换抛出异常

时间:2013-08-28 21:59:14

标签: java android class casting

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

任何人都可以告诉我如何解决我目前正在做的事情,或以类似的方式达到同样的目的吗?

谢谢! /最大

3 个答案:

答案 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的一个错误。重写代码修复了问题,我无法重现此问题

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

  • 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

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

答案 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