2016-05-23 94 views
0

我对Java泛型颇为陌生,使用Java 8 groupingBy时遇到了问题。Java 8分组通过泛型集合

我需要实现鸣叫的容器,它具有以下接口:,

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类有public方法getStringID

public class Tweet implements Serializable { 
... 
    public String getLang() { return lang; } 
... 
} 

是什么错误意味着什么,我做错了吗?

更新

@Radiodef,感谢您的回答,但我想挖成问题深一点。列表一个集合,不是吗?我知道术语协变性 - 当我们有A,B,B类扩展A时,我们正在谈论GenericClass<A>GenericClass<B>的继承。这里我们有相反的情况:相同的参数化类型,但不同的(嵌套的)泛型类。在这种情况下,什么是Java规则,或者我应该记住哪些关键字/术语,如果我想自己阅读它的话?

回答

0

groupingBy收集到Map<K, List<T>>

Map<String, List<T>> res = 
//   ^^^^^^^ 
    tweets.stream().collect(Collectors.groupingBy(T::getLang));