2012-11-16 352 views
0

我有以下方法,採用類的列表作爲參數:方法不適用於參數,但是不知道爲什麼

public List<Interface> getInterfacesOfTypes(List<Class<? extends InternalRadio>> types) { 
    List<Interface> interfaces = new ArrayList<Interface>(); 

    for(Interface iface : _nodes) 
     if(types.contains(iface._type)) 
      interfaces.add(iface); 

    return interfaces; 
} 

我想要做的就是它只有一個創建一個包裝單級指定,這就要求只有一個類的列表,上面的方法:

public List<Interface> getInterfacesOfType(Class<? extends InternalRadio> type) {  
    return getInterfacesOfTypes(Arrays.asList(type)); 
} 

不過,我得到一個錯誤:

The method getInterfacesOfTypes(List<Class<? extends InternalRadio>>) in the type InterfaceConnectivityGraph is not applicable for the arguments (List<Class<capture#3-of ? extends InternalRadio>>) 

我不明白爲什麼這是或甚至意味着什麼capture #3-of。我非常感謝任何幫助!

+1

我理解你的問題,但是,你爲什麼不只是創建一個' ArrayList',在其中添加'type'並將它傳遞給'getInterfacesOfTypes(List )'方法? – HericDenis

回答

1

解決方案

更改界面如下:

public List<Interface> getInterfacesOfTypes(List<? extends Class<? extends InternalRadio>> types) 

老實說,我真的不能解釋爲什麼。擴大允許泛型集合的範圍(通過添加「?」延伸),只是更容易讓編譯器看這是啥...

除了

  • 相反的Arrays.asList(type)我會寫Collections.singletonList(type)
  • 與「_」加前綴類成員是罕見的在Java中
  • 我覺得Interface是不是一個偉大的名字爲「接口」也是一個Java概念(這似乎Interface不是這樣的界面:))
  • 我可能會在Interface上使用'getType()'函數,而不是直接引用它的'_type'字段 - 這可以讓以後更輕鬆地進行重構。
  • 你或許可以接受任何Collection而不需要List
0

如果你確信你的對象類型:

public List<Interface> getInterfacesOfType(final Class<? extends InternalRadio> type) 
    { 
     final List list = Arrays.asList(type); 
     @SuppressWarnings("unchecked") 
     final List<Class<? extends Interface>> adapters = list; 

     return getInterfacesOfTypes(adapters); 
    } 
相關問題