2012-02-03 85 views
0

考慮下面的代碼:我如何使用泛型類型來構造集合?

interface IParam {} 

class Parameter implements IParam {} 

void foo(Collection<? extends IParam> params) { 
    SortedSet<? extends IParam> sortedParams; 
    if (params instanceof SortedSet) 
     sortedParams = (SortedSet<? extends IParam>) params; 
    else 
     sortedParams = new TreeSet<IParam>(params); 
} 

我得到的是一些參數的集合。
我需要的是一個SortedSet的參數。
如果給定的集合已經是SortedSet,我想使用它。
否則,我將創建一個只包含給定集合的內容的新TreeSet。

但是,此代碼不會編譯關於未經檢查的轉換的警告。

有沒有什麼方法可以實現我想要的,而不會抑制警告?

回答

3

編譯就好了。我會稍微重構代碼雖然,使其更容易概念化和維護:

protected <T extends IParam> void foo(Collection<T> params) { 
    SortedSet<T> sortedParams; 
    if (params instanceof SortedSet) 
     sortedParams = (SortedSet<T>) params; 
    else 
     sortedParams = new TreeSet<T>(params); 

    System.out.println(sortedParams); 
} 

順便說一句,檢查的方法中instanceof,雖然不違法,有時是代碼味道的標誌。你的方法可以與一些超載進行重構:

protected <T extends IParam> void foo(SortedSet<T> params) { 
    System.out.println("Doing something with sorted set); 
} 

protected <T extends IParam> void foo(Collection<T> params) { 
    SortedSet<T> sortedParams = new TreeSet<T>(params); 
    System.out.println("Doing something with other collection types"); 
    foo(sortedParams); 
} 
+0

謝謝你! 做到了! – stmoebius 2012-02-03 11:15:13

1

您可以通過添加兩件事情讓這個代碼編譯:

  • 你的方法foo需要在一類。 Java不允許在類之外存在方法。
  • 第8行和第10行缺少;。在Java中必須使用分號。
+0

感謝您指出我只在這裏使用概念代碼。 – stmoebius 2012-02-03 11:16:58