![](/img/trans.png)
[英]In Java super.getClass() prints “Child” not “Parent” - why is that?
[英]How to get the parent base class object super.getClass()
我有一點Java問題(作為一名C ++程序員)。
我有2個相關的課程:
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版本。 我不希望客戶知道這一點,因此客戶只能看到Patient類。 在服務器端,我執行轉換。
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太困惑了。
謝謝
getClass().getSuperclass()
但是不要使用它。 這肯定是糟糕設計的標志。
尼斯... super.getClass()實際上是對象的的getClass(),它返回它是在調用的實例的運行時類型( 這在這種情況下)。 因此你收到同一個班級......
相反,要求運行時類的這種使用超類的實現的,你應該問的超類通過的getClass返回的類:
getClass().getSuperclass()
順便說一下,你的意思是什么?“這將允許我概括一些我需要在每個孩子中實施的方法,這是非常糟糕的。”? 您確定沒有其他設計選擇嗎?
Object.getClass()
返回一個對象的運行時類型,因此在調用前加上super
對實際上沒有多大幫助。
你可以使用getClass().getSuperclass()
。
嘗試: getClass().getSuperclass().toString()
我發現很多時候以你建議的方式用“魔法”解決問題會導致解決方案不靈活。
如果你想要獲得你的超級課程,你可能想要的是在你的父類中調用一個方法,該方法明確地實現你在查找父類型后要采取的任何動作。
此外,如果您當前實現的方法實際上是在您的父類中,並且該方法指的是在子類中實現的抽象方法 - 在您的頭上翻轉您的設計,那么設計很可能會更好。
當然我從你想要獲得父母類型的過程中推斷這一切並且可能完全錯誤,但我認為如果你知道你父母的課程是你正在尋找的答案那么你就會問錯誤的問題 - 返回向上幾英尺再看一遍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.