动态铸造:

时间:2010-11-24 15:45:02

标签: dynamic casting

看起来很明显。如何将对象myObjet转换为myObjet.getClass的类型? 我尝试了forName(),cast和其他的组合......似乎没有工作:s

问题是我有一个对象列表,我想让它们恢复到原始类型(由myObjet.getClass.getName()提供)。

此致 添


是的,这是Java,肯定没错。让我解释一下这个问题。想象一个处理简单形式的程序,如Squares和Circles,它们是来自主要类Form的派生类。

所以有一个返回Form的搜索函数,但你必须提供表单的类型和引用(例如一个数字):

Form myForm= searchForm(String formType, String formRef)

我知道它返回的Form是什么,因为我将这些参数提供给搜索函数:例如,一个正方形。返回的对象仍然是一个Form,但我希望它是Square类,所以我需要抛出它。它是兼容的,因为Square继承自Form。

唯一的问题是“formType”是可变的,它可能确实是Square,但它也可能是“Circle”。这就是我需要为返回对象进行通用转换的原因。

如果我执行myForm.getClass()。getName(),我会得到“Square”。所以我需要将myForm强制转换为myForm.getClass()。

你看到了问题吗?

1 个答案:

答案 0 :(得分:0)

投射不会改变对象本身。转换只会改变编译器允许您对对象执行的操作。

Java提供了两种描述对象可以做什么的方法:类和接口。你投射的东西必须是编译器在编译时知道的东西。否则,编译器无法阻止您做一些愚蠢的事情,比如尝试编写myCircle.bark()

所以你有两个选择:如果这些类有共同点(一个已实现的接口,或者它们都来自的类),你可以尝试转换为该常见描述。但听起来这不是你想要的。相反,Java强迫你做的是拥有一系列if/else语句,这些语句试图将你的对象转换为你可能想要做的事情的每个具体类,比如Square,{{1}等等。

但是将一个对象转换为它自己的类是没有意义的,因为它在编译时没有给编译器任何关于该对象执行或不具有哪些方法的信息。