Java: 你能用一个变量来表达沮丧吗?
Java: Can you downcast with a variable?
如果我有一些派生的 classes,它们的方法与基础 class 不同,但彼此相似,我可以使用变量来向下转换吗?
例如:
Object derivedClass = baseClass.getChild().getClass();
((derivedClass)differentClassObj.differentClassMethod()).derivedClassMethod();
也许这太模糊了 and/or 效率不高,因为我可以在基础 class 中创建空方法来绕过这个问题(或其他我没有学过的技巧),但我仍然好奇是否可以将变量传递给转换。
感谢您的见解!
编辑: 为了进一步澄清任何混淆,我正在尝试确定是否可以使用变量进行转换。所以说我想将一些东西转换为字符串(只是为了争论):
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();
虽然您可以使用 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 Class
对象实际表示。因此,即使你有一个代表 ChildClassOne
的 derivedClass
对象,你也只知道它是一个 Class<? extends ParentClass>
。虽然对象的 cast
方法会为 ChildClassTwo
的实例抛出异常,但您不能对 return 值调用 ChildClassOne
方法。
如果此 class 层次结构中 classes 的所有实例都具有您要查找的方法,但基础 class 无法提供有用的实现,您应该标记基 class 抽象并将此方法作为抽象方法赋予它。如果此 class 层次结构中的某些对象没有您正在寻找的方法,您可能应该重新设计您的程序或以常规方式执行强制转换。引入接口可能是个好主意。无论如何,使用 Class
对象进行转换可能对您没有帮助。
如果我有一些派生的 classes,它们的方法与基础 class 不同,但彼此相似,我可以使用变量来向下转换吗?
例如:
Object derivedClass = baseClass.getChild().getClass();
((derivedClass)differentClassObj.differentClassMethod()).derivedClassMethod();
也许这太模糊了 and/or 效率不高,因为我可以在基础 class 中创建空方法来绕过这个问题(或其他我没有学过的技巧),但我仍然好奇是否可以将变量传递给转换。
感谢您的见解!
编辑: 为了进一步澄清任何混淆,我正在尝试确定是否可以使用变量进行转换。所以说我想将一些东西转换为字符串(只是为了争论):
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();
虽然您可以使用 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 Class
对象实际表示。因此,即使你有一个代表 ChildClassOne
的 derivedClass
对象,你也只知道它是一个 Class<? extends ParentClass>
。虽然对象的 cast
方法会为 ChildClassTwo
的实例抛出异常,但您不能对 return 值调用 ChildClassOne
方法。
如果此 class 层次结构中 classes 的所有实例都具有您要查找的方法,但基础 class 无法提供有用的实现,您应该标记基 class 抽象并将此方法作为抽象方法赋予它。如果此 class 层次结构中的某些对象没有您正在寻找的方法,您可能应该重新设计您的程序或以常规方式执行强制转换。引入接口可能是个好主意。无论如何,使用 Class
对象进行转换可能对您没有帮助。