[英]Java 8 groupingBy on generic collection
我是Java泛型的新手,使用Java 8 groupingBy
遇到问题。
我需要实现一个具有以下接口的推文容器:
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
类具有公共方法getStringID
:
public class Tweet implements Serializable {
...
public String getLang() { return lang; }
...
}
错误是什么意思,我在做什么错?
更新资料
@Radiodef,感谢您的回答,但我想更深入地探讨一个问题。 列表是一个集合,不是吗? 我知道术语协方差-当我们有类A,B,B扩展A时,我们正在谈论GenericClass<A>
和GenericClass<B>
继承。 在这里,我们有相反的情况:相同的参数化类型,但是不同的(嵌套的)泛型类。 在这种情况下,有哪些Java规则,或者如果我想自己阅读它,应该记住哪些关键字/术语?
groupingBy
收集到Map<K, List<T>>
。
Map<String, List<T>> res =
// ^^^^^^^
tweets.stream().collect(Collectors.groupingBy(T::getLang));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.