2016-05-23 2 views
0

Я довольно новичок в Java-генераторах, и у меня есть проблема с использованием Java 8 groupingBy.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; } 
... 
} 

Что значит ошибка и что я делаю неправильно?

Update

@Radiodef, спасибо за ваш ответ, но я хотел выкопать в вопрос немного глубже. Список is a Collection, не так ли? Я знаю терминологическую ковариацию - когда у нас есть классы 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)); 
Смежные вопросы