2013-08-28 112 views
-4

我有一个超类A和类B,C和d扩展A.Java类铸造抛出异常

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的工作室将不会在catch里面断点处停止,任何试图挽救约从捕获结果的异常信息在null ...)。

我明白为什么我不能动态地指定新的对象类型,然后将obj转换为该类型,但是如果它们都共享共同父项,我不明白为什么它不起作用。

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

谢谢! /最大

+1

你可以显示你的方法,你如何调用它,以及完整的堆栈跟踪? –

+1

'InstantiationException或IllegalAccessException,我不知道',你如何期待我们知道? – jbx

+0

你能不能展示newInstance()方法的代码? – Ankit

回答

2

在端,这是由于与机器人工作室的一个错误。重写代码固定的问题,我无法重现此问题

,未来的搜索可能找到有用的其他症状:

  • 机器人工作室在断点不会停止catch块
  • 任何试图保存有关导致无效的捕捉内部异常的信息(见下面的例子)

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

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

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

    } 
} 

打印 “真”

+0

谢谢,实际上这是android studio导致我的问题的一个问题。我认为这是对我的误解,这意味着我试图做一些不受支持的事情。我试过你的示例代码,它当然工作得很好。感谢您花时间提供帮助 –

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

输出: -

内C内

内部d