2011-12-09 73 views
1

好吧,我知道你不能有抽象的靜態方法,儘管我個人認爲這是個限制。我也知道覆蓋靜態方法是沒用的,因爲當我處理MyList<T extends ObjectWithId>這樣的處理,並且我的對象有一個抽象類,並且在它的子類中有一個被重寫的靜態方法時,T在運行時不存在,所以ObjectWithId的靜態方法是而不是子類。在java中使用泛型的抽象靜態/靜態替代方法的替代方案

因此,這裏是我:

class PersistentList<T extends ObjectWithId> implements List<T>{ 

} 

其中ObjectWithId是:

abstract ObjectWithId{ 
    public abstract long getId(); 
} 

現在的問題是,我的PersistentList意味着存儲在硬盤上,因此得名,並實際上只會存儲它所持有的對象的ID。現在,當我想要實現的PersistentList

@Override 
public T get(int index) { 

} 

方法,我想是我的程序來使用它存儲indexid和調用靜態方法objectForId(long id)這將在ObjectWithId每個子類實現。它不能成爲實例方法,因爲現在還沒有實例,重點是使用id從硬盤加載實例。那麼它應該如何實施?一種選擇是讓ObjectWithId在每個子類中都有一個構造函數ObjectWithId(long id),但T在運行時不存在,那麼我將如何實例化它?我知道我可以在PersistentList的構造函數中傳遞Class<T>對象,但我更喜歡如果構造函數沒有任何參數,但我不認爲有沒有辦法在沒有明確傳遞它的情況下獲取T類?

我希望這是一個更好的解釋,對於我開始的模棱兩可的問題感到抱歉。

+0

真的是你的問題:「我如何得到一個通用參數的類型」?如果是這樣,那麼已經有很多問題了,例如, http://stackoverflow.com/questions/182636/how-to-determine-the-class-of-a-generic-type,http://stackoverflow.com/questions/1372432/how-to-obtain-class-type-實例泛型參數類型,http://stackoverflow.com/questions/2223233/how-to-get-generics-class等 –

回答

1

雖然將Class<T>作爲構造函數參數傳遞,但它並不能真正解決您的問題。然後,您可以訪問該類,但要訪問在該類上定義的靜態方法,您將不得不使用泛型(除非其他人知道從Class對象調用在類中定義的靜態方法的方法)。

我會定義一個新的通用接口,它包含一個通用方法objectForID,像

public interface ObjectRetriever<T>{ 
    public T objectForID(long aID); 
} 

和調整PersistentList的構造採取這種ObjectRetriever實例作爲參數。這ObjectRetriever然後可以用於基於它們的ID恢復對象。

+0

對不起,我通過類的意思是,我可以調用T的構造函數,而不是靜態方法生成實例。你的方法可以工作,但是id不告訴我對象的類型,只是T類型對象組中的id。如果我使用你的方法,我仍然不知道T在運行時是什麼樣的那麼我將如何調用適當的方法來處理對象,如果它基於T的類型。 – user1084563

+1

你不會在意T是什麼。在您創建PersistentList的代碼中的任何地方,您都知道T的類型是什麼,並且將一個可用的'ObjectRetriever'實例傳遞給構造函數。 PersistentList應該不必關心T的運行時類型。它應該只知道當它調用該函數時,該函數將返回列表可以存儲的類型爲T的對象 – Robin

+0

這將起作用,我只希望是一種不需要將任何東西傳遞到列表中的方法,我寧願如果列表的功能與常規List的功能相同,那麼它們可以簡單地與我已有的列表進行互換。太糟糕了,你不能有抽象的靜態方法。 – user1084563

1

雖然從靜態方法開始看起來總是比較容易,但我發現通常避免使用靜態方法通常是有益的,並且默認使用實例方法。

這樣做的好處是可擴展性。除了允許繼承和避免你提到的「限制」之外,它還提供了可擴展性 - 不需要重新設計和稍後更改API。例如,「這個類完全符合我的需求,但我希望只能改變這一部分功能」。如果有靜態方法調用其他靜態方法,沒有好辦法做到這一點。如果所有的方法都是非靜態的 - 我可以繼承這個類並覆蓋所需的功能部分。

對靜態方法的其他(有點相關的)限制是它們不能用於實現接口。總之,我更喜歡爲「效用方法」保留靜態方法,這些方法所執行的功能是非常明確的,並且沒有任何可行的將來需要提供替代實現的可能原因。

+0

感謝您的快速響應,雖然我只是更新了問題,以更好地反映我正在尋找。需要它是靜態的或構造函數是必要的,因爲實例尚不存在,我將使用它來生成實例。 – user1084563