我对Java泛型相当陌生,我在使用Java8 groupingBy时遇到了问题。
我需要实现一个具有以下接口的tweet容器:
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.ObjectTweet类具有公共方法getStringID
public class Tweet implements Serializable {
...
public String getLang() { return lang; }
...
}这个错误意味着什么,我做错了什么?
更新
@Radiodef,谢谢你的回答,但我想深入探讨一个问题。List 是a Collection,不是吗?我知道项协方差--当我们有类A,B,B扩展A时,我们讨论的是GenericClass<A>和GenericClass<B>的继承。这里我们有相反的情况:相同的参数化类型,但不同(嵌套)泛型类。在这种情况下,Java规则是什么,或者如果我想亲自阅读Java规则,我应该记住哪些关键字/术语?
发布于 2016-05-23 23:03:13
groupingBy收集到一个Map<K, List<T>>。
Map<String, List<T>> res =
// ^^^^^^^
tweets.stream().collect(Collectors.groupingBy(T::getLang));https://stackoverflow.com/questions/37401641
复制相似问题