我正在对实现接口的类的对象进行流式处理。我希望将它们收集为接口的元素列表,而不是实现类。
对于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来收集类的接口列表?
如果有人有比明确选角更好的解决方案,我也很乐意听到:)
泛型类型参数解析每次只进行一次方法调用。
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