2014-02-13 77 views
2

我试图做到以下几点,以避免未经检查的投以后:无法从Set <Map.Entry <String,capture#2-of?将A >>扩展为Set <Map.Entry <String ,?扩展A >>

代码:

Set<Entry<String, ? extends SerializableForLayout>> set = 
layoutObjectList.entrySet(); 

错误:

Type mismatch: cannot convert from Set<Map.Entry<String,capture#2-of ? 
extends SerializableForLayout>> 
to Set<Map.Entry<String,? extends SerializableForLayout>> 

全代码:

public void loadLayoutList(ArrayList<SerializableForLayout> preparedList, 
          ConcurrentHashMap<String, ? extends SerializableForLayout> layoutObjectList 
           ) 
    {  
     SerializableForLayout t; 
     if (layoutObjectList == null)return; 

     Set<?> set = layoutObjectList.entrySet();  
     Iterator<?> itTags = set.iterator(); 
     Entry<String, SerializableForLayout> entry; 

     while (itTags.hasNext()) { 
      entry = (Entry<String, SerializableForLayout>) itTags.next(); 
      t = entry.getValue(); 
      addForSerializableLayouts(t,preparedList); 
     } 
     Collections.sort(preparedList, ApplicationsSort.LayoutWeightComparator); 
    } 

这工作:

Set<?> set = layoutObjectList.entrySet(); 

但有一个警告:

强行压制就行了未经检查的转换:

entry = (Entry<String, SerializableForLayout>) itTags.next(); 

我如何这样做,而不需要压制?

+0

如果你想编译时类型安全,你必须能够告诉它什么类型是在编译时。如果你直到运行时才知道,你会得到未经检查的警告,这就是警告的意思。许多“真实”的API充满了压制的束缚,这只是在java中处理运行时类型的现实。 – Affe

+0

[Bounded-wildcard相关的编译器错误]的可能重复(http://stackoverflow.com/questions/18907262/bounded-wildcard-related-compiler-error) –

回答

4

问题是,您正在使用多个? s,而在Java中它们不能保证是相同的。使这个方法是通用的,这样你就有一个泛型类型参数可以引用,并且在整个方法中都是一样的。

public <T extends SerializableForLayout> 
    void loadLayoutList(ArrayList<SerializableForLayout> preparedList, 
         ConcurrentHashMap<String, T> layoutObjectList) 

那么你应该能够正确地定义你的set变量,使用T

Set<Map.Entry<String, T>> set = layoutObjectList.entrySet(); 
1

在我来说,我需要:

public static <K, V> void printMap(Map<K, V> map) { 
     Set<Entry<K, V>> entrySet = map.entrySet(); 
     for (Entry<K, V> entry : entrySet) { 
      System.out.println(entry.getKey() + " " + entry.getValue()); 
     } 
    } 
} 
相关问题