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规则,或者我应该记住哪些关键字/术语,如果我想自己阅读它的话?