繁体   English   中英

Java 8分组按通用集合

[英]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是我自己的类,具有正确实现的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类具有公共方法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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM