2013-01-14 91 views
1

如何返回一個使用泛型作爲空列表的自定義對象?返回一個通用空列表

我已經擴展了List接口,並創建了自己的自定義類型

public interface MyCustomList<T> 
    extends List<T> 
{ 

在一個類中,我有它返回一個自定義列表的方法,但我總是一個編譯器錯誤告終。基本上這個方法的默認實現應該返回一個空列表,但我不能讓它工作,因爲我遇到了下面的錯誤。 「不兼容類型」

public MyCustomList<MyCustomBean> getCodes(String code) 
{ 
    return Collections.<MyCustomList<MyCustomBean>>emptyList(); 
} 

請告訴我發回一個「泛型」空單執行的正確方法?

+0

爲什麼你需要一個自定義的List接口? –

+2

不是答案,而是解釋:你不能這樣做的原因是因爲Collections.emptyList()的簽名是'列表 emptyList()'。這意味着它將返回一個T列表。當你像這樣調用'emptyList()'時,它實際上會返回'List >',但是'getCodes()'方法會返回一個' MyCustomList '所以你得到一個編譯時錯誤。 –

回答

2

敷衍impl有什麼問題嗎?

class MyCustomListImpl<T> extends ArrayList<T> implements MyCustomList<T> {} 

return new MyCustomListImpl<MyCustomBean>(); 
+0

'MyCustomList'只是界面。在你的決定中,你將不得不在'return'語句的匿名類中實現所有'List'接口。 – Andremoniy

+0

@Andremoniy oops - 沒有注意到。固定。 :) – Bohemian

+0

去了這個答案,但其他答案對我也很酷..謝謝! –

0

在你的情況下,這是不可能的,直到你將有適當的實現你的接口MyCustomList

UPD:Collections.emptyList()收益專項實施List接口,這當然是無法轉換爲您MyCustomList的。

+0

是的,鑄造無法工作,因爲我遇到'不可兌換的類型'.. –

2

Collections.emptyList返回List<T>,其實現hidden。由於您的MyCustomList接口是分機List,因此無法在此處使用此方法。

爲了這個工作,你需要做的空MyCustomList的實現,以同樣的方式,核心API的Collections實現空List實現,然後用它來代替。例如:

public final class MyEmptyCustomList<T> extends AbstractList<T> implements MyCustomList<T> { 

    private static final MyEmptyCustomList<?> INSTANCE = new MyEmptyCustomList<Object>(); 

    private MyEmptyCustomList() { } 

    //implement in same manner as Collections.EmptyList 

    public static <T> MyEmptyCustomList<T> create() { 

     //the same instance can be used for any T since it will always be empty 
     @SuppressWarnings("unchecked") 
     MyEmptyCustomList<T> withNarrowedType = (MyEmptyCustomList<T>)INSTANCE; 

     return withNarrowedType; 
    } 
} 

或者更準確地說,隱藏類本身作爲一個實現細節:

public class MyCustomLists { //just a utility class with factory methods, etc. 

    private static final MyEmptyCustomList<?> EMPTY = new MyEmptyCustomList<Object>(); 

    private MyCustomLists() { } 

    private static final class MyEmptyCustomList<T> extends AbstractList<T> implements MyCustomList<T> { 
     //implement in same manner as Collections.EmptyList 
    } 

    public static <T> MyCustomList<T> empty() { 
     @SuppressWarnings("unchecked") 
     MyCustomList<T> withNarrowedType = (MyCustomList<T>)EMPTY; 
     return withNarrowedType; 
    } 
} 
0

不能使用Collections.emptyList()用於此目的。這是類型安全的,似乎做你正在尋找!

+0

這不會工作..編譯時錯誤。 –

+0

不,我的意思是不使用自定義接口(MyCustomList),只使用方法原型中的實際類型。在你想返回空列表的地方,簡單的使用Collections.emptyList()。是否有理由定義自己的界面? – Nrj