请看下面的测试代码:import java.util.Vector;
class Base 
{
private Vector vector=new Vector();

public void addObject(Base obj)
{
vector.add(obj);
}

public Base[] getObjects()
{
/*
Base objs[];
if(this.getClass()==Derive1.class)
objs=new Derive1[vector.size()];
else if(this.getClass()==Derive2.class)
objs=new Derive2[vector.size()];
else if(this.getClass()==Derive3.class)
objs=new Derive3[vector.size()];
else
objs=new Base[vector.size()];
*/ Base objs[]=new Base[vector.size()]; 
vector.toArray(objs);

return objs;
}
}class Derive1 extends Base
{
public void specialMethod1()
{
System.out.println("SpecailMethod1");
}
}class Derive2 extends Base
{
public void specialMethod2()
{
System.out.println("SpecailMethod2");
}
}class Derive3 extends Base
{
public void specialMethod3()
{
System.out.println("SpecailMethod3");
}
}public class Test
{
public void testDerive1()
{
Derive1 obj=new Derive1();
obj.addObject(new Derive1());
Derive1 objs[]=(Derive1[])obj.getObjects();
for(int i=0;i<objs.length;i++)
{
objs[i].specialMethod1();
}
}

public void testDerive2()
{
Derive2 obj=new Derive2();
obj.addObject(new Derive2());
Derive2 objs[]=(Derive2[])obj.getObjects();
for(int i=0;i<objs.length;i++)
{
objs[i].specialMethod2();
}
} public void testDerive3()
{
Derive3 obj=new Derive3();
obj.addObject(new Derive3());
Derive3 objs[]=(Derive3[])obj.getObjects();
for(int i=0;i<objs.length;i++)
{
objs[i].specialMethod3();
}
} public static void main(String[] args)
{
Test obj=new Test();
obj.testDerive1();
obj.testDerive2();
obj.testDerive3();
}
}
getObjects方法我希望仅在Base中实现一次,而在所有派生类中调用时都可以正确地返回相应类型,强制转换后可以调用派生类的特殊方法。问题是:如果我在getObjects中用Base objs[]=new Base[vector.size()]; 则不能将函数结果强制转换成派生类,系统会报ClassCastException错误,如果按/*...*/中的方法虽然可行,但是这样的代码不通用,每增加一个派生类都得改getObjects方法,这种处理我很难接受。如果大家有好的解决方法,请不吝赐教,在此谢过!

解决方案 »

  1.   

    感觉楼主没有实现多态,建议在base中放一函数,然后在派生类中实现,取出元素时转成base类即可,让多态自己做吧。
      

  2.   

    方法里面稍微改一下 public void testDerive1() {
    Derive1 obj = new Derive1();
    obj.addObject(new Derive1());
    Base objs[] = (Base[]) obj.getObjects();
    for (int i = 0; i < objs.length; i++) {
    ((Derive1)objs[i]).specialMethod1();
    }
    } public void testDerive2() {
    Derive2 obj = new Derive2();
    obj.addObject(new Derive2());
    Base objs[] = (Base[]) obj.getObjects();
    for (int i = 0; i < objs.length; i++) {
    ((Derive2)objs[i]).specialMethod2();
    }
    } public void testDerive3() {
    Derive3 obj = new Derive3();
    obj.addObject(new Derive3());
    Base objs[] = (Base[]) obj.getObjects();
    for (int i = 0; i < objs.length; i++) {
    ((Derive3)objs[i]).specialMethod3();
    }
    }
      

  3.   

    感觉楼主没有实现多态,建议在base中放一函数,然后在派生类中实现,取出元素时转成base类即可,让多态自己做吧。
    -------------------
    楼主这个怎么没有实现多态了
    Base里加个输出Base的方法,Derive1;里override该方法,输出Derive1,
    然后Base objs[] = (Base[]) obj.getObjects();之后objs[0].prt(),这里就动态绑定了,调用的是Derive1的方法,不信自己试试
      

  4.   

    多谢各位,如果要在派生类做一些实现,这不是我的目的,接口方式我试了,也不行。
    我看了一JDK的一些源代码,知道怎么做了,只要将Base objs[]=new Base[vector.size()]; 这一行改成Base objs[]=(Base[])java.lang.reflect.Array.newInstance(this.getClass(),vector.size());就可以搞定了。