Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java无法在没有明显冗余类型转换的情况下正确推断流类型_Java_Arrays_Casting_Java Stream_Inference - Fatal编程技术网

Java无法在没有明显冗余类型转换的情况下正确推断流类型

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

我正在做一系列的流式处理来展平2D阵列

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[]{…}
,其中
..
是属性的各种实现。

属性
是一个通用类(我想知道为什么不使用as
T

如果出现此错误,则表示声明了原始类型,例如:

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)
as
Optional
的返回类型,因为它有一个显式的返回类型,但没有更进一步的返回类型,是吗?是,我不知道为什么会有这种限制,但我猜是简化类型的干扰。@JMY1000对于相对较新的用户来说可能有点困惑,但重复并不一定意味着重复的问题,而是重复的答案。我相信回答问题的人,你可以在这两篇文章的10+个非常详细的答案中找到你的答案。@FélixGagnon Grenier我知道,我对SE相当熟悉。正如你在下面的答案和其他评论中所看到的,重复问题的答案中的相关部分并不相同。
Attribute[] attributes = ...;