【发布时间】:2017-03-26 17:19:00
【问题描述】:
我有以下集合类,它包含一个用于对地图中的元素进行分组的方法,其中每个值都具有调用它的类的类型
class TaskCollection<E extends Task> extends HashSet<E> {
<K> Map<K, ? extends TaskCollection<E>> groupBy(Function<E, K> groupingFunction) {
return this.stream()
.collect(Collectors.groupingBy(
groupingFunction,
Collectors.toCollection(this.collectionConstructor())
));
}
Supplier<? extends TaskCollection<E>> collectionConstructor() {
return TaskCollection::new;
}
}
我想要的是能够创建使用groupBy 方法的子类,该方法将自身的新实例作为地图值返回。
下面是一个例子
class AssertionCollection extends TaskCollection<Assertion> {
Map<Person, AssertionCollection> groupByPerson() {
return this.groupBy(Assertion::assignedPerson);
}
@Override
Supplier<AssertionCollection> collectionConstructor() {
return AssertionCollection::new;
}
}
问题出在groupByPerson 方法中。编译器为groupBy 调用抛出错误。
Error:(15, 28) java: incompatible types: no instance(s) of type variable(s) K exist so that java.util.Map<K,? extends TaskCollection<Assertion>> conforms to java.util.Map<Person,AssertionCollection>
我是 Java 新手,所以我很确定我没有看到一些愚蠢的东西
【问题讨论】:
-
关于您的实现的评论:似乎
TaskCollection有一个HashSet比TaskCollection是一个HashSet更有意义。HashSet的使用感觉像是一个实现细节。需要继承HashSet吗?