我对Java(作为C ++程序员)有一点问题。
我有两个相关的课程:
public class Patient() {
...
}
public class PatientPersistent extends Patient {
...
public void foo() {
System.out.println(super.getClass().toString());
}
}
这将输出:
class org.example.smartgwt.server.model.PatientPersistent
有没有办法获得父类的类型?即。
class org.example.smartgwt.server.model.Patient。
这将允许我概括一些我需要在每个孩子中实施的方法,这些方法很糟糕。
谢谢!
我正在使用Dozer将我的域Hibernate对象转换为Serializable版本。我不希望客户知道这一点,因此客户只能看到患者类。在服务器端,我执行转换。
public class DataObject<Type> {
private static final Class<Object> DstType = Type;
public Object convert(Object srcData, final BeanFactory factory) {
Mapper mapper = (Mapper)factory.getBean("dozerMapper");
return (Object)mapper.map(srcData, DstType);
}
}
public class Patient() implements Serializable {
public Set foo;
}
public class PatientPersistent extends Patient {
public org.hibernate.collection.PersistentSet foo;
DataObject<Patient> converter = new DataObject<Patient>;
public Patient convertToSerializable(final BeanFactory factory) {
return (Patient)converter.convert(this, factory);
}
}
public class main() {
// This object is not serializable so I cannot send it to the client
PatientPersistent serializableBar = new PatientPersistent();
// Using Dozer to copy the data PatientPersistent -> Patient
// This will load the Dozer spring bean and copy as mapped
Patient copiedSerializableData = serializableBar.convertToPersistent(bar, factory);
}
我知道这段代码不起作用,但这只是为了说明问题。我希望能够将对象转换为可序列化的形式,以便我可以将其发送回客户端。这就是为什么我想给父母的类型。调用映射器将始终是相同的事物,源对象和Dest.class。
也许我对java太困惑了。
由于
答案 0 :(得分:33)
getClass().getSuperclass()
但不要使用它。这肯定是糟糕设计的标志。
答案 1 :(得分:8)
Nice ... super.getClass()实际上是Object的getClass(),它返回调用它的实例的运行时类型(在本例中为 this )。因此,您收到同一个班级......
不要使用super的实现请求 this 的运行时类,而应该要求getClass返回的类的超类:
getClass().getSuperclass()
顺便说一句,你的意思是什么?“这将允许我概括一些我需要在每个孩子中实施的方法,这些方法很糟糕。”?你确定没有其他设计选择吗?
答案 2 :(得分:6)
Object.getClass()
会返回对象的运行时类型,因此将super
添加到调用中并不会产生太多影响。
您可以使用getClass().getSuperclass()
。
答案 3 :(得分:2)
尝试:getClass().getSuperclass().toString()
答案 4 :(得分:1)
我发现很多时候以你建议的方式解决“魔法”问题会导致解决方案不灵活。
如果你想要获得你的超级课程,你可能想要的是在你父母的课堂上调用一个方法,该方法明确地实现你在查找父类型后要采取的任何动作。
此外,如果您当前实现的方法实际上是在您的父类中并且该方法指的是在子类中实现的抽象方法,那么设计很可能会更好 - 翻转您的设计它的头。
当然我从你想要获得父母类型的过程中推断这一切可能是完全错误的,但我确实认为,如果你知道你父母的课程是你正在寻找的答案那么你就会问错误的问题 - 后退几英尺再看一遍。