2010-02-22 113 views
4

我想,現在我會理解Java泛型。但現在我又無助了。Java泛型+靜態工廠方法= [恐慌]

我有一個泛型類,其中c-tor構造正確類型的實例,而靜態工廠方法產生類型不匹配。

請看下面的代碼:

public class _GenericFactoryMethods { 

    public final static class DemoClass<T1, T2> { 
    private final T1 _1; 
    private final T2 _2; 

    // static factory method 
    public static <T1, T2> DemoClass<T1, T2> create(T1 _1, T2 _2) { 
     return new DemoClass<T1, T2>(_1, _2); 
    } 

    // usual c-tor 
    public DemoClass(T1 _1, T2 _2) { 
     this._1 = _1; 
     this._2 = _2; 
    } 

    public T1 get1() { return _1; } 

    public T2 get2() { return _2; } 
    } 

    public void doSomething() { 
    String str = "test"; 

    Class<? extends CharSequence> _1 = str.getClass(); 
    CharSequence _2 = str; 

    // works 
    DemoClass<Class<? extends CharSequence>, CharSequence> dc1 = 
     new DemoClass<Class<? extends CharSequence>, CharSequence>(_1, _2); 

    // compile error 
    DemoClass<Class<? extends CharSequence>, CharSequence> dc2 = 
     DemoClass.create(_1, _2); 
    } 

} 

的錯誤是:

Uncompilable source code - incompatible types 
required: _GenericFactoryMethods.DemoClass<java.lang.Class<? extends java.lang.CharSequence>,java.lang.CharSequence> 
found: _GenericFactoryMethods.DemoClass<java.lang.Class<capture#794 of ? extends java.lang.CharSequence>,java.lang.CharSequence> 

請幫助理解和解決這個問題。
(我真的需要一些這樣的類的靜態工廠方法)。

編輯
有人能也解釋爲什麼顯式類型參數必須使用?

回答

6

嘗試

DemoClass.<Type1, Type2>create(_1, _2); 

當我從他的有效的Java第二版的喬希布洛赫的介紹記住:「上帝殺害小貓每次你指定一個明確的類型參數「。儘量避免這樣的結構。

+0

謝謝。那麼,寫通常的構造函數是更長的;)對於我的特殊情況(**不是**的例子),我真的需要靜態工廠方法。 – 2010-02-22 12:48:44

+1

嘆息,沒有機會擊敗提及小貓的答案。起首! ;) – sfussenegger 2010-02-22 13:00:02

+0

@sfussenegger:是的,這是有點作弊,每個人都喜歡小貓))) – Roman 2010-02-22 13:06:10

1

在這種情況下,你必須明確地設置泛型類型:

dc2 = DemoClass.<Class<? extends CharSequence>, CharSequence>create(_1, _2);