Java无法在没有明显冗余类型转换的情况下正确推断流类型
我正在做一系列的流式处理来展平2D阵列Java无法在没有明显冗余类型转换的情况下正确推断流类型,java,arrays,casting,java-stream,inference,Java,Arrays,Casting,Java Stream,Inference,我正在做一系列的流式处理来展平2D阵列 Arrays.stream(attributes) .map(Attribute::getCommand) .filter(Optional::isPresent) .map(Optional::get) .flatMap((array) -> (Arrays.stream((String[]) array))) .toArray(String[]::new) 其中属性符合以下界面: public inter
Arrays.stream(attributes)
.map(Attribute::getCommand)
.filter(Optional::isPresent)
.map(Optional::get)
.flatMap((array) -> (Arrays.stream((String[]) array)))
.toArray(String[]::new)
其中属性
符合以下界面:
public interface Attribute<T> {
Optional<String[]> getCommand();
}
这三种实现都可以正常工作,输出预期的[Hello,world,Foo]
编辑: 这被标记为的副本。我可能错了,但似乎有区别,因为这种类型是以更明确的方式指定的。值得注意的是,IntelliJ同意,在上述文章提供的示例中,强制转换是必要的,但对我的代码来说不是。如果我错了,请告诉我
编辑:
每个请求,
属性
的声明是Attribute[]attributes=newattribute[]{…}
,其中..
是属性的各种实现。属性
是一个通用类(我想知道为什么不使用asT
。如果出现此错误,则表示声明了原始类型,例如:
Attribute[] attributes = ...;
对于原始类型,声明为Optional
的getCommand()
的返回类型将变为仅Optional
将
Attribute
声明为泛型类型,例如:Attribute[]attributes=
这应该在不使用强制转换的情况下编译,或者如果不需要,只删除参数化类型T
@JMY1000您的属性
声明是什么?属性是一个通用类:类属性
:查看
。您似乎声明了一个原始类型:Attribute
而不是泛型类型:Attribute
。但是getCommand()
是用返回类型Optional
声明的,而不是Optional
或其他什么。为什么该类型突然被忽略?请再次阅读我的回答:对于原始类型,声明为可选的getCommand()返回类型将变为可选。
@davidxxx,谢谢。我想我可能只是在重复的问题中遗漏了一些东西,但是为什么会出现这种情况呢?Java只推断出一个级别的方法调用。它不能推断嵌套lambda表达式的类型。@PeterLawrey好的,我想我明白了。因此Java能够推断Arrays.stream(attributes).map(Attribute::getCommand).filter(Optional::isPresent)
asOptional
的返回类型,因为它有一个显式的返回类型,但没有更进一步的返回类型,是吗?是,我不知道为什么会有这种限制,但我猜是简化类型的干扰。@JMY1000对于相对较新的用户来说可能有点困惑,但重复并不一定意味着重复的问题,而是重复的答案。我相信回答问题的人,你可以在这两篇文章的10+个非常详细的答案中找到你的答案。@FélixGagnon Grenier我知道,我对SE相当熟悉。正如你在下面的答案和其他评论中所看到的,重复问题的答案中的相关部分并不相同。
Attribute[] attributes = ...;