0
我對Java泛型頗爲陌生,使用Java 8 groupingBy
時遇到了問題。Java 8分組通過泛型集合
我需要實現鳴叫的容器,它具有以下接口:,
public interface TweetsContainer<T extends Tweet> extends Iterable<T>, Serializable {
...
Map<String, Collection<T>> groupByLang();
...
}
Tweet
是我自己的類正確實施hashcode
,equals
等
這是我嘗試實現方法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規則,或者我應該記住哪些關鍵字/術語,如果我想自己閱讀它的話?