
每当涉及交集类型并且您使用的方法引用使用的接收器类型不是第一个(第一个类型是在类型擦除之后将保留的类型)时,都会发生此问题。
因此,当您用lambda表达式替换方法引用时,您将不再受到该错误的影响。如果
Serializable从类型中删除,则的推断元素类型
Stream将为
Fruit,即不是交集类型,同样不会发生此问题。但是,通过实现
Fruit和的两种元素类型
Serializable,编译器将推断出元素类型
Object&Fruit&Serializable,而原始类型将是原始类型
Object,当使用带有接收器类型的方法引用时,原始类型将引发错误
Fruit。您可以轻松解决此问题:
Stream.of(apples.stream(), oranges.stream()) .<Fruit>flatMap(Function.identity()) .map(Fruit::getPickingMonth) // no more exception on this line .forEachOrdered(System.out::println);
编译后的代码将与您的原始代码相同,但是 *** 作的正式结果类型
flatMap将为
Stream<Fruit>,而忽略推断出的交集类型的所有其他工件。结果,方法引用
Fruit::getPickingMonth将
Function<Fruit,Integer>代替实现类型,
Function<Object&Fruit&Serializable,Integer>并且不会出现编译器错误。
但是请注意,您的代码不必要地复杂。您可以简单地使用
Stream.<Fruit>concat(apples.stream(), oranges.stream()) .map(Fruit::getPickingMonth) // no more exception on this line .forEachOrdered(System.out::println);
实现相同。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)