這似乎是一個新問題,但是上次我使用Java時,該語言沒有泛型。我有一個類層次結構(名稱變更爲爲廣義地):通過通用父項訪問子類中的Java靜態成員
public abstract class AbstractBase { .... }
public class ConcreateSubA extends AbstractBase { .... }
public class ConcreateSubB extends AbstractBase { .... }
...
public class ConcreateSubZZ9PluralZAlpha extends AbstractBase { .... }
...
我試圖清理一些遺留代碼,並有一個地方,一噸重複重複的都可以被分解成通過泛型的一個例程。 (我想仿製藥,因爲當這個程序被調用,它需要只在具體類的一個操作。)
例行的樣子
public <Thing extends AbstractBase> void someFunc()
{
another_function_call (Thing.concreteSpecialToken);
// could also be
// another_function_call (Thing.concreteSpecialToken());
// if methods are more feasible than fields
// Cannot use
// another_function_call (Thing().concreteSpecialToken());
// because creating instances of these types is a Major Operation[tm]
}
我要離開了,卻有無數的線,但這是重要的部分:someFunc()
是類型參數(它實際上需要參數,但它們都不是推理)。最終我需要獲取一個特殊的令牌,這是我變得模糊的地方。
標記是每個具體類的巨大驢獨特的字符串。它們是基於類的,而不是基於實例的。實際標記值在每個子類中聲明爲private static final
字段。
所以我需要使用基類的公共方法/字段來(最終)獲取到子類的私有靜態字段。顯然,我不能在基地申報abstract static
方法,因爲這沒有意義。如果數據是基於實例的,那麼這將是微不足道的,在基類中有一個多態的getter,但子類的東西是靜態的。
我覺得我在這裏錯過了Java泛型的一個特性,但是我不能使用Thing.whatever()
,除非whatever
是可以在抽象基類中聲明的東西。我遇到了Java的侷限性或者我缺乏專業知識來彌補這個缺口。我所做的那個看起來很有前途的嘗試在整個類層次結構中一直存在大量的代碼複製,並且使用完全相同的代碼來定義抽象方法......這就是泛型應該有助於防止的問題!
+1爲'ZZ9PluralZAlpha' :-) –