2016-05-23 93 views
0

我對Java泛型頗爲陌生,使用Java 8 groupingBy時遇到了問題。Java 8分組通過泛型集合

我需要實現鳴叫的容器,它具有以下接口:,

public interface TweetsContainer<T extends Tweet> extends Iterable<T>, Serializable { 
... 
    Map<String, Collection<T>> groupByLang(); 
... 
} 

Tweet是我自己的類正確實施hashcodeequals

這是我嘗試實現方法groupByLang

public class LinkedListTweetsContainer<T extends Tweet> implements TweetsContainer<T> { 
    private final List<T> tweets; 
... 
    @Override 
    public Map<String, Collection<T>> groupByLang() { 
     Map<String, Collection<T>> res = 
      tweets.stream().collect(Collectors.groupingBy(T::getLang)); 
     return res; 
    } 
... 
} 

但是,我得到一個錯誤在T::getLang,說

Error:(51, 36) java: incompatible types: inference variable R has incompatible bounds 
    equality constraints: java.util.Map<java.lang.String,java.util.List<T>> 
    upper bounds: java.util.Map<java.lang.String,java.util.Collection<T>>,java.lang.Object 

Tweet類有public方法getStringID

public class Tweet implements Serializable { 
... 
    public String getLang() { return lang; } 
... 
} 

是什麼錯誤意味着什麼,我做錯了嗎?

更新

@Radiodef,感謝您的回答,但我想挖成問題深一點。列表一個集合,不是嗎?我知道術語協變性 - 當我們有A,B,B類擴展A時,我們正在談論GenericClass<A>GenericClass<B>的繼承。這裏我們有相反的情況:相同的參數化類型,但不同的(嵌套的)泛型類。在這種情況下,什麼是Java規則,或者我應該記住哪些關鍵字/術語,如果我想自己閱讀它的話?

回答

0

groupingBy收集到Map<K, List<T>>

Map<String, List<T>> res = 
//   ^^^^^^^ 
    tweets.stream().collect(Collectors.groupingBy(T::getLang));