3 回答

TA貢獻1820條經驗 獲得超9個贊
這里 :
protected AbstractObj computeDiff(AbstractObj o1, AbstractObj o2){
AbstractObj delta = ...?
}
您可以獲得o1with的具體類o1.getClass()。然后,如果這個具體類有一個默認構造函數,你可以調用它Class.newInstance():
protected AbstractObj computeDiff(AbstractObj o1, AbstractObj o2) throws IllegalAccessException, InstantiationException{
AbstractObj delta = o1.getClass().newInstance();
}

TA貢獻1836條經驗 獲得超13個贊
您可以使用 instanceof 語句。您可以將 o1 轉換為 ConcreteObj 并使用此類的方法或字段。
if(o1 instanceof ConcreteObj){
//((ConcreteObj)o1).someMethod();
}

TA貢獻1780條經驗 獲得超1個贊
這絕對是代碼氣味。不要使用 instanceof。不要使用反射。
絕對不要繼續走這條路。
您的所有AbstractObj
實例都實現了一組通用操作。由于您computeDiff
對 AbstractObjs 進行操作,因此它不能依賴于它接收的不同實現的任何特殊功能。
因此,方法接收或返回什么類型的對象并不重要,只要它們都遵守 AbstractObj 定義。如果需要,您可以返回一個擴展 AbstractObj 的匿名類或任何其他子類。您甚至可以為此目的創建一個特定的子類。但是無論你返回什么,它都不能返回比 AbstractObj 更多的東西。
將參數和返回值聲明為AbstractObj
與調用您方法的人簽署的合同。不要破壞你的合同。
添加回答
舉報