Я довольно новичок в 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 в этом случае или какие ключевые слова/термины мне следует учитывать, если я хочу сам прочитать об этом?