有一个基类,叫做A
他有几个子类,A1,A2,A3,...
现在有一个函数叫做
do(A a);
然后他会对应某一种特定的子类来进行do(A1 a1)或者do(A2 a2)等等。
于是我在do(A a)中就要写
{
  if (a instanceof A1) do((A1)a);
  if (a instanceof A2) do((A2)a);
  ...
}
这样好麻烦。有没有好的方法?
我试过用Class类的cast方法,但是转换出来要求Class的泛型是要求的类,否则也转换出来是Object或者A,不是某一个Ai。
还是我没做对?

解决方案 »

  1.   

    先通通转成object,然后你想干啥就干啥。
      

  2.   

    使用case强转需要指明强转的类型,因此和上述的方法没有什么区别。
    不太清楚问题背景,是否是使用函数返回类型转换的结果,可以在说明一点。
      

  3.   

    是这样的,就是要处理一个针对不同子类分别做不同事情的函数。
    void do(A a) {
      if (a instanceof A1) do((A1)a);
      if (a instanceof A2) do((A2)a);
      if (a instanceof A3) do((A3)a);
      ...
    }void do(A1 a1) {
      对A1做一些事情,这里要用一些A1里面的东西,是A所不能提供的
    }void do(A2 a2) {
    }...如果只是要知道a的类型的话,可以做到。但是要把a转换成对应的类型就有点困难了。
      

  4.   

    答:当然有啦.否则像楼主做样写这么多的if语句,还不累死人!更严重的是,这样写if使得代码没有弹性了,以后要再增加一个新的A100,你难道还要再增加一条if?
    显然楼主对JAVA的面向对象的继承,还是不熟悉.这是典型的多态(
    看到那么多的 if (a instanceof X)通常都很可能有问题 )参考代码:
    class A
    {
     public void doA(A a)
     {
     a.doA(a);//只要这一条语句就行了,不要那么多的IF语句
     }
    }class A1 extends A
    {
      public void doA(A a)
      {
      if(!(a instanceof A1))return;
      A1 a1=(A1)a;  //要这样强转回你自己的类型,就可以访问你自己特殊的数据了
      a1.methodA1();//A1自己独有的方法与数据
      }
      private void methodA1()
      {
      System.out.println("A1自己独有的方法与数据");
      }
    }class A2 extends A
    {
      public void doA(A a)
      {
      if(!(a instanceof A2))return;
      A2 a2=(A2)a; //要这样强转回你自己的类型,就可以访问你自己特殊的数据了
      a2.methodA2();//A2自己独有的方法与数据
      }
      private void methodA2()
      {
      System.out.println("A2自己独有的方法与数据");
      }
    }
    public class Test12 {
    public static void main(String[] args) {
    // TODO Auto-generated method stub
           A a=new A();
           a.doA(new A1());
           a.doA(new A2());
    }}
    程序运行结果:
    A1自己独有的方法与数据
    A2自己独有的方法与数据
      

  5.   

    还是不太懂你的意思,但如果你想导出类还是调用自己的方法,这是很显然的,这是java向上转型决定的。
    这是我的一个小例子,只是给个参考
    package exsample;
    class A
    {
     public void doA()
     {
         System.out.println("这是基类的函数");
     }
    }class A1 extends A
    {
      public void doA()
      {
         System.out.println("这是A1类的函数");
      }
    }class A2 extends A
    {
      public void doA()
      {
        System.out.println("这是A2类的函数");
      }}
    public class Test {
    public static void main(String[] args){
    A [] obj = {new A(),new A1(),new A2()};
    for(int i=0;i<obj.length;i++)
    obj[i].doA();
    }

    }
    运行结果如下:
    这是基类的函数
    这是A1类的函数
    这是A2类的函数
      

  6.   

    我明白5楼的意思了。这是个很好的方法。但是这样写起来程序会比较乱,而且可能情况是A,A1,A2...这些类只是用于存放数据,do()函数需要在外面来搞定,或者他们的do中需要调用另一些类或者包里面的资源,需要在这些包里面定义这个do()函数,这样怎么办呢?如果再定义很多类来继承这些A类,好像也比较麻烦。
      

  7.   

    我觉得5楼的方法比较好,虽然定义新的do类和method方法麻烦,但在对象较少的情况下,看起来简洁,一目了然。
      

  8.   

    今天刚看到一个isInstance()方法,你可以定义一个Object数组,比如说,object [] types = new Object[5];
    然后进行初始化,用class对象或类字面常量,略了,这样你就可以用一个for循环,types[i].isInstance(o);
    你可以参考java编程思想