如果我有一些派生类的方法与基类不同,但彼此相似,那么可以使用变量进行向下转换吗?
例如:
Object derivedClass = baseClass.getChild().getClass();
((derivedClass)differentClassObj.differentClassMethod()).derivedClassMethod();
也许这太模糊和/或效率不高,因为我可以在基类中创建空方法来绕过这个问题(或者我还没有学过的其他技巧),但是我仍然很好奇是否可以传递变量投入与否。
感谢您的见解!
编辑:以进一步澄清任何混淆,我正在尝试确定是否可以使用变量进行转换。所以说我想把一些东西作为一个字符串(只是出于争论的缘故):
String myObjStr = MyObject.class.getSimpleName();
// Then I want to know if I can cast objects using that variable in the casting
//(so far it doesn't appear to be working but I know that's because its a string.
//Is there some way I can manipulate it so that I CAN cast with it?)
((myObjStr).differentClassObj.differentClassMethod()).derivedClassMethod();
答案 0 :(得分:3)
虽然您可以使用Class对象来指定将对象强制转换为的类型,但它并没有真正帮助您:
Class<? extends ParentClass> derivedClass = baseClassObject.getChild().getClass();
// The following kind of does the cast you want, but not in a useful way:
derivedClass.cast(differentClassObject)
问题是你仍然需要静态地知道结果的类型。 cast
输出的静态类型仅与Class
对象的 static 类型一样具体,而不是Class
对象实际表示的类。因此,即使您有derivedClass
个对象代表ChildClassOne
,您也只知道它是Class<? extends ParentClass>
。虽然对象的cast
方法会为ChildClassTwo
的实例抛出异常,但您无法在返回值上调用ChildClassOne
方法。
如果此类层次结构中的所有类实例都具有您正在查找的方法,但基类无法提供有用的实现,则应将基类标记为abstract,并将此方法作为抽象方法提供。如果此类层次结构中的某些对象没有您正在寻找的方法,则应该重新设计程序或以常规方式执行强制转换。引入界面可能是个好主意。无论如何,使用Class
对象进行投射可能对您没有帮助。