Java:您可以使用变量进行预测吗?

时间:2016-05-20 23:16:39

标签: java variables derived-class downcast

如果我有一些派生类的方法与基类不同,但彼此相似,那么可以使用变量进行向下转换吗?

例如:

    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();

1 个答案:

答案 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对象进行投射可能对您没有帮助。