当前位置: 首页 > 知识库问答 >
问题:

为什么我不能在Java 16中使用Stream#ToList来收集类的接口列表?

常献
2023-03-14

我正在对实现接口的类的对象进行流式处理。我希望将它们收集为接口的元素列表,而不是实现类。

对于Java16.0.1的stream#toList方法,这似乎是不可能的。例如,在下面的代码中,最后一条语句将无法编译。

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class WhyDodo {

    private interface Dodo { }

    private static class FancyDodo implements Dodo { }

    public static void main(String[] args) {
        final List<Dodo> dodos = Stream.of(new FancyDodo()).collect(Collectors.toList());
        final List<FancyDodo> fancyDodos = Stream.of(new FancyDodo()).toList();

        final List<Dodo> noFancyDodos = Stream.of(new FancyDodo()).toList();
    }
}

我们可以显式地将每个元素从fancydodo转换为dodo。但至少为了简洁起见,我们可以使用.collectors.tolist())

为什么我不能在Java 16中使用Stream#ToList来收集类的接口列表?

如果有人有比明确选角更好的解决方案,我也很乐意听到:)

共有1个答案

羊舌兴德
2023-03-14

泛型类型参数解析每次只进行一次方法调用。

stream.of(new FancyDodo())将始终将t解析为FancyDodo,因此将始终导致

ToList()不解析T,它只是使用已经建立的T,因此结果总是列表 列表 列表 不兼容。参见:list list 的子类吗?为什么Java泛型不是隐式多态的?

collectors.tolist())collectors.tolist()中具有不同的t,可以与t进行不同的解析。编译器将t解析为dodo,因为所需的返回类型为list

 类似资料:
  • 当使用Java8流时,获取一个列表、从中创建一个流、处理业务并将其转换回来是很常见的。类似于: 有什么想法吗?

  • 类集合有一些静态方法作为实用工具来操作集合,如List。例如,排序方法(Collections.sort(list))。我不理解为什么Java规范制作了另一个类来承载排序方法(以及所有其他类,如binarySearch),而不列出接口和具体的子类,如ArrayList和LinkedList,来实现这些方法。 已更新 当我做了一个全球性的研究并阅读了这篇文章的答案时,我不得不说(鸟瞰图):一些人(我

  • 我只想问关于争论的事。方法名并不重要,但每个方法都采用不同参数的唯一顺序,因此Oracle可以实现这个特性,而不是让每个“lambda-interface”都有一个方法。

  • 流已经提供了方法来转换为数组,那么为什么不提供和?

  • 我有这个方法,它在Dart 2中编译没有问题。但是,在运行时,我得到以下错误 输入

  • 问题内容: 该主题充分说明了这一点-为什么不能在接口中声明静态方法的原因是什么? 上面的代码给了我以下错误(至少在Eclipse中):“接口方法ITest.test()的非法修饰符;仅允许public&abstract”。 问题答案: 这里有一些问题。第一个问题是声明静态方法而不定义它的问题。这是之间的区别 和 由于Espo提到的原因,第一个是不可能的:你不知道哪个实现类是正确的定义。 Java