2016-05-23 8 views
0

私はJavaのジェネリックスには新しく、Java 8 groupingByを使用すると問題があります。私は次のインタフェースを持っているツイートのコンテナ実装する必要がJava 8のグループ化一般的なコレクションについて

:適切にここでhashcodeequalsなど

を実装して

public interface TweetsContainer<T extends Tweet> extends Iterable<T>, Serializable { 
... 
    Map<String, Collection<T>> groupByLang(); 
... 
} 

Tweetは自分のクラスでメソッドを実装する私の試みです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; 
    } 
... 
} 

ただし、エラーは0

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

エラーは、私が間違ってやっている何を意味してん:言っ、

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を持っていますか?

更新

@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)); 
関連する問題