问下JAVA中基类转换成不同子类的简单方法

shivawu 2009-03-27 04:45:06
有一个基类,叫做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。
还是我没做对?
...全文
346 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanglingzhong 2009-04-01
  • 打赏
  • 举报
回复
今天刚看到一个isInstance()方法,你可以定义一个Object数组,比如说,object [] types = new Object[5];
然后进行初始化,用class对象或类字面常量,略了,这样你就可以用一个for循环,types[i].isInstance(o);
你可以参考java编程思想
AcHerat 2009-03-27
  • 打赏
  • 举报
回复
我觉得5楼的方法比较好,虽然定义新的do类和method方法麻烦,但在对象较少的情况下,看起来简洁,一目了然。
shivawu 2009-03-27
  • 打赏
  • 举报
回复
我明白5楼的意思了。这是个很好的方法。但是这样写起来程序会比较乱,而且可能情况是A,A1,A2...这些类只是用于存放数据,do()函数需要在外面来搞定,或者他们的do中需要调用另一些类或者包里面的资源,需要在这些包里面定义这个do()函数,这样怎么办呢?如果再定义很多类来继承这些A类,好像也比较麻烦。
wanglingzhong 2009-03-27
  • 打赏
  • 举报
回复
还是不太懂你的意思,但如果你想导出类还是调用自己的方法,这是很显然的,这是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类的函数
云上飞翔 2009-03-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 shivawu 的帖子:]
有一个基类,叫做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…
[/Quote]
答:当然有啦.否则像楼主做样写这么多的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自己独有的方法与数据
mumu_java 2009-03-27
  • 打赏
  • 举报
回复
目前只能这样转化。
shivawu 2009-03-27
  • 打赏
  • 举报
回复
是这样的,就是要处理一个针对不同子类分别做不同事情的函数。
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转换成对应的类型就有点困难了。
knight2000004 2009-03-27
  • 打赏
  • 举报
回复
使用case强转需要指明强转的类型,因此和上述的方法没有什么区别。
不太清楚问题背景,是否是使用函数返回类型转换的结果,可以在说明一点。
createWang 2009-03-27
  • 打赏
  • 举报
回复
先通通转成object,然后你想干啥就干啥。

62,622

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧