由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Java版 - 请教一个动态cast的问题
相关主题
问题征解[合集] 谁能解释一下这里的protected specifier
question: how to implement this请问有没有generic的array
a synchonized problem!Is it possible to get Class object for T from a generic class? (下列空档,是否可填)
what's inside an java object?synchronization 锁住了什么?
Re: 如何在两个窗口之间通信?一个关于generics的问题
java 依赖注入和反射是必须掌握的吗?看了zhaoce073大水忍不住说2句
Re: 初级问题[合集] 问一下这个cast在java里是怎么work的
请问protected的使用请教 class cast problem
相关话题的讨论汇总
话题: instanceb话题: bar话题: cast话题: class话题: classb
进入Java版参与讨论
1 (共1页)
m*****j
发帖数: 499
1
ClassB1,B2,...,Bn都是ClassA的subclass,现在有某个ClassBi的一个instanceB,
但是我取到它的时候只知道它是A,不知道他具体是哪个B。
e.g.我拿到一个苹果(instanceB),但是现在只知道这是个水果类(ClassA)而不知道
到底是什么水果。我的目的是把instaceB cast成苹果类。
我现在能用reflection取得instanceB的class以及class name,可是不知道怎么才能用
这个信息将instanceB cast成他自己的真实的subclass。因为只有cast后才能用B的某
些方法?我试了如下两种方法都不work。根据(http://
stackoverflow.com/questions/2127318/java-how-can-i-do-dynamic-casting-of-a-v
ariable-from-one-type-to-another),似乎只能将ClassB1...ClassBn一个一个用ins
tanceof试一遍?
多谢!
code:
ClassA instanceB = xxx.getInstance(yyy); // this is third party API
Class classB = instanceB.getClass(); // this returns the correct subclass of
instanceB
// method 1
instanceB = (classB)instanceB; // this does NOT work
// method 2
Object o = classB.cast(instanceB); // this works, but since the returned is
an Object, I still canNOT use classB methods
N***m
发帖数: 4460
2
没太看懂,估摸着写吧
suppose class Bar implemnts Foo, and in bar, we have a method called "run()"
, then
final Foo f = new Bar();
for (final Method m : f.getClass().getDeclaredMethods()) {
if (m.getName().equals("run")) {
m.invoke(f, null);
}
}
Is this what you want?
m*****j
发帖数: 499
3
多谢。不过似乎不是我想要的。我又修改了一下原帖,麻烦再看看?
把你代码改成Bar extends Foo就差不多了。我现在只知道某个object是Foo,需要把它
cast成Bar,不知道该怎么cast。

)"

【在 N***m 的大作中提到】
: 没太看懂,估摸着写吧
: suppose class Bar implemnts Foo, and in bar, we have a method called "run()"
: , then
: final Foo f = new Bar();
: for (final Method m : f.getClass().getDeclaredMethods()) {
: if (m.getName().equals("run")) {
: m.invoke(f, null);
: }
: }
: Is this what you want?

N***m
发帖数: 4460
4
你原文里面写的
"因为只有cast后才能用B的某些方法?"
如果只是运行某个指定的方法,给的方法已经可以了.
不明白你为什么还要cast呢?还有什么其它原因没说?

【在 m*****j 的大作中提到】
: 多谢。不过似乎不是我想要的。我又修改了一下原帖,麻烦再看看?
: 把你代码改成Bar extends Foo就差不多了。我现在只知道某个object是Foo,需要把它
: cast成Bar,不知道该怎么cast。
:
: )"

m*****j
发帖数: 499
5
哦哦 明白了 这样不用cast也可以调用ClassB的方法了
我光想着cast完了用instanceB.method()了
刚才试了已经成功了
多谢多谢!
不过话说回来,这样的cast的确是不可能的吗?

【在 N***m 的大作中提到】
: 你原文里面写的
: "因为只有cast后才能用B的某些方法?"
: 如果只是运行某个指定的方法,给的方法已经可以了.
: 不明白你为什么还要cast呢?还有什么其它原因没说?

r*****s
发帖数: 985
6
是的,
你原先的想法就是有违OO以及reflection精神的。

【在 m*****j 的大作中提到】
: 哦哦 明白了 这样不用cast也可以调用ClassB的方法了
: 我光想着cast完了用instanceB.method()了
: 刚才试了已经成功了
: 多谢多谢!
: 不过话说回来,这样的cast的确是不可能的吗?

N***m
发帖数: 4460
7
可不可能我不知道,但是显然没必要啊.
设想你可以cast,不妨就是你原先写的那样,
object o = f.cast() ....
或者
Bar b = f.cast() ....
这里,情形1 :你还得用object这个变量来hold f,得不偿失,
scope变大了,还不如原先的定义;
情形2,你都知道Bar类型了,直接转换不就得了?

【在 m*****j 的大作中提到】
: 哦哦 明白了 这样不用cast也可以调用ClassB的方法了
: 我光想着cast完了用instanceB.method()了
: 刚才试了已经成功了
: 多谢多谢!
: 不过话说回来,这样的cast的确是不可能的吗?

m*****j
发帖数: 499
8
哦?看来该补补OO的课了。。。
能不能展开讲讲具体怎么个违背法?

【在 r*****s 的大作中提到】
: 是的,
: 你原先的想法就是有违OO以及reflection精神的。

B*****g
发帖数: 34098
9
co-ask,红芽开奖做吧

【在 m*****j 的大作中提到】
: 哦?看来该补补OO的课了。。。
: 能不能展开讲讲具体怎么个违背法?

m*****j
发帖数: 499
10
情形1就是我原帖里的method2,的确有这样的问题
情形2的话,问题就是我不知道具体是哪个Bar类,有可能是Bar1,Bar2,...BarN,所以
我原来想的理想状态是取得instanceB的class之后让他自己cast到自己的Bar去,就像这
样:
instanceB = (instanceB.getClass())instanceB
当然,这是不work的

【在 N***m 的大作中提到】
: 可不可能我不知道,但是显然没必要啊.
: 设想你可以cast,不妨就是你原先写的那样,
: object o = f.cast() ....
: 或者
: Bar b = f.cast() ....
: 这里,情形1 :你还得用object这个变量来hold f,得不偿失,
: scope变大了,还不如原先的定义;
: 情形2,你都知道Bar类型了,直接转换不就得了?

相关主题
java 依赖注入和反射是必须掌握的吗?[合集] 谁能解释一下这里的protected specifier
Re: 初级问题请问有没有generic的array
请问protected的使用Is it possible to get Class object for T from a generic class? (下列空档,是否可填)
进入Java版参与讨论
N***m
发帖数: 4460
11
"我原来想的理想状态是取得instanceB的class之后让他自己cast到自己的Bar去"
你的意思是如下类似的转换(假定这样的cast存在)?
String actualClassName = f.getClass().getName(); // "Bar" here
f = cast(f,actualClassName );
//
问题是f总归是Foo类型的...
所以你只能用另外一个Bar类型的变量来hold返回值.
可是正如前文所说的,这岂不是多此一举...

所以
像这

【在 m*****j 的大作中提到】
: 情形1就是我原帖里的method2,的确有这样的问题
: 情形2的话,问题就是我不知道具体是哪个Bar类,有可能是Bar1,Bar2,...BarN,所以
: 我原来想的理想状态是取得instanceB的class之后让他自己cast到自己的Bar去,就像这
: 样:
: instanceB = (instanceB.getClass())instanceB
: 当然,这是不work的

m*****j
发帖数: 499
12
我原来想的是还用这个变量。。。只是让他从Foo类变成Bar类。。。
我估计这就是redbuds说的不符合OO原则的地方吧?

【在 N***m 的大作中提到】
: "我原来想的理想状态是取得instanceB的class之后让他自己cast到自己的Bar去"
: 你的意思是如下类似的转换(假定这样的cast存在)?
: String actualClassName = f.getClass().getName(); // "Bar" here
: f = cast(f,actualClassName );
: //
: 问题是f总归是Foo类型的...
: 所以你只能用另外一个Bar类型的变量来hold返回值.
: 可是正如前文所说的,这岂不是多此一举...
:
: 所以

g*****g
发帖数: 34805
13
你要从头想,为啥要这个变量,不就是为了调用某个方法吗?
假设这个方法叫做blah。如果Foo可以blah,那blah就应该
在Foo里声明,没有这个问题。如果Foo不能blah,Bar可以,
当初接口为啥要传Foo进来呢,传Bar不好吗?
这不是反射能不能实现的问题,但凡碰到类似的地方,先考虑
重构。除非是第三方代码,没法动。

【在 m*****j 的大作中提到】
: 我原来想的是还用这个变量。。。只是让他从Foo类变成Bar类。。。
: 我估计这就是redbuds说的不符合OO原则的地方吧?

m*****j
发帖数: 499
14
嗯 多谢了
那的确是个第三方的API 直接返回的是一个代表所有建筑构件的类
用户具体选择可能是门啊窗啊啥的,都是其子类,各自又有不同的方法
so。。。

【在 g*****g 的大作中提到】
: 你要从头想,为啥要这个变量,不就是为了调用某个方法吗?
: 假设这个方法叫做blah。如果Foo可以blah,那blah就应该
: 在Foo里声明,没有这个问题。如果Foo不能blah,Bar可以,
: 当初接口为啥要传Foo进来呢,传Bar不好吗?
: 这不是反射能不能实现的问题,但凡碰到类似的地方,先考虑
: 重构。除非是第三方代码,没法动。

r*****l
发帖数: 2859
15
You need to know ClassB to call its method.
If you don't use generics, do something like this:
if (instanceB instanceof ClassB) {
// call the method
}
If you use generics, change your getInstance() to:
T getInstance(Class, ...).
Don't see the reason why you want to dynamically cast.

知道
-v
ins

【在 m*****j 的大作中提到】
: ClassB1,B2,...,Bn都是ClassA的subclass,现在有某个ClassBi的一个instanceB,
: 但是我取到它的时候只知道它是A,不知道他具体是哪个B。
: e.g.我拿到一个苹果(instanceB),但是现在只知道这是个水果类(ClassA)而不知道
: 到底是什么水果。我的目的是把instaceB cast成苹果类。
: 我现在能用reflection取得instanceB的class以及class name,可是不知道怎么才能用
: 这个信息将instanceB cast成他自己的真实的subclass。因为只有cast后才能用B的某
: 些方法?我试了如下两种方法都不work。根据(http://
: stackoverflow.com/questions/2127318/java-how-can-i-do-dynamic-casting-of-a-v
: ariable-from-one-type-to-another),似乎只能将ClassB1...ClassBn一个一个用ins
: tanceof试一遍?

m*****j
发帖数: 499
16
thanks~

【在 r*****l 的大作中提到】
: You need to know ClassB to call its method.
: If you don't use generics, do something like this:
: if (instanceB instanceof ClassB) {
: // call the method
: }
: If you use generics, change your getInstance() to:
: T getInstance(Class, ...).
: Don't see the reason why you want to dynamically cast.
:
: 知道

d******3
发帖数: 232
17
Define virtual function GetType in Class A and overwrite it in all the
subclasses. You will not meet this issue.

知道
-v
ins

【在 m*****j 的大作中提到】
: ClassB1,B2,...,Bn都是ClassA的subclass,现在有某个ClassBi的一个instanceB,
: 但是我取到它的时候只知道它是A,不知道他具体是哪个B。
: e.g.我拿到一个苹果(instanceB),但是现在只知道这是个水果类(ClassA)而不知道
: 到底是什么水果。我的目的是把instaceB cast成苹果类。
: 我现在能用reflection取得instanceB的class以及class name,可是不知道怎么才能用
: 这个信息将instanceB cast成他自己的真实的subclass。因为只有cast后才能用B的某
: 些方法?我试了如下两种方法都不work。根据(http://
: stackoverflow.com/questions/2127318/java-how-can-i-do-dynamic-casting-of-a-v
: ariable-from-one-type-to-another),似乎只能将ClassB1...ClassBn一个一个用ins
: tanceof试一遍?

m*****j
发帖数: 499
18
多谢~ class定义是第三方的自己没法改。。。
不过不是太明白,getType返回什么?自己的class吗?那和getClass()不是一样了吗?

【在 d******3 的大作中提到】
: Define virtual function GetType in Class A and overwrite it in all the
: subclasses. You will not meet this issue.
:
: 知道
: -v
: ins

r*****l
发帖数: 2859
19
co 不是太明白

【在 m*****j 的大作中提到】
: 多谢~ class定义是第三方的自己没法改。。。
: 不过不是太明白,getType返回什么?自己的class吗?那和getClass()不是一样了吗?

1 (共1页)
进入Java版参与讨论
相关主题
请教 class cast problemRe: 如何在两个窗口之间通信?
Singleton vs. static class?java 依赖注入和反射是必须掌握的吗?
请教一个Queue实现的问题Re: 初级问题
如何造Array of Generic Type请问protected的使用
问题征解[合集] 谁能解释一下这里的protected specifier
question: how to implement this请问有没有generic的array
a synchonized problem!Is it possible to get Class object for T from a generic class? (下列空档,是否可填)
what's inside an java object?synchronization 锁住了什么?
相关话题的讨论汇总
话题: instanceb话题: bar话题: cast话题: class话题: classb