2009-09-04 32 views
11

參數化類時是否可以指定默認類型? 例子:在泛型中使用Java進行可選參數化

// abstract class  
public abstract class AbsClass<T1 extends Par1Class, T2 extends Par2Class> { 
     // code 
    } 


// parametrized imlementation class 
public class RealClass extends AbsClass<ClassThatExtendsPar1, ClassThatExtendsPar2Class> { 
    // code 
} 

// non-parametrized imlementation class 
public class RealClass extends AbsClass { 
    // code 
} 
我在執行

我必須指定NONE或所有參數。有可能使第二個參數非強制性,如下所示:

// abstract class  
public abstract class AbsClass<T1 extends Par1Class, T2 extends Par2Class : default Par2Class > { 
     // code 
    } 

// parametrized only mandatory imlementation class 
public class RealClass extends AbsClass<ClassThatExtendsPar1> { 
    // code 
} 

回答

18

簡單的回答:不,java不支持這樣的默認參數化。

1

從來沒有真正有理由這樣做。通常,您需要指定泛型類型參數,因爲某些方法參數會獲取或返回該類型的參數。如果未指定是有效的,那麼似乎表明您意圖不執行這些方法的任何有意義的實現。

無論如何,爲了解決您感覺到的問題,只需指定「Object」作爲您不需要指定的任何類型參數即可。或者用另一個只有一個類型參數的抽象類(在你的extends調用中指定Object作爲第二個類型參數)來擴展抽象類。

+1

從我的角度來看有這樣做的一個很好的理由。因爲我的「可選參數」(T2擴展Par2Class)是一個我們用作Value對象的類,並且在其他類的批次中被擴展。如果我不指定T2,我只使用ValueObject的默認方法。如果我指定,我需要特定的方法,而不必投。 我想在繼承順序中引入另一個類,但我對可選參數化很好奇。謝謝。 – davorp 2009-09-07 06:17:18

+0

我可能是錯的,但我認爲有這樣的用例。在C++中,允許使用默認的模板類型,可以使用它們。用於爲STL類型提供默認版本的內存分配器。 – Rom1 2011-07-18 08:18:18

+0

如果SwingWorker的中間類型參數與結果參數相同,那麼典型的良好用法就是SwingWorker的中間類型參數。 – 2012-02-27 13:00:52

0

嗯,你的情況下,正確的解決方案可能是

// parametrized only mandatory imlementation class 
public class RealClass<StillGeneric extends Par1Class> 
extends AbsClass<ClassThatExtendsPar1, StillGeneric> { 
    // code 
} 
+0

但我需要AbsClass的「參數化」方法。如果我參數化RealClass,在我的情況下是沒有用的。還是我誤判了一些事情? – davorp 2009-09-07 06:04:45

相關問題