Java 内联代码-不兼容类型:无法推断类型变量T

Java 内联代码-不兼容类型:无法推断类型变量T,java,Java,我有这样一段代码: Stream<Supplier<String>> stream = Stream.of(() -> "str"); stream.map(Supplier::get).findFirst(); 但我得到了: 不兼容类型:无法推断类型变量T 及 无效的方法引用无法引用非静态方法get() 从静态上下文 我感到困惑,因为我认为内联代码不会改变它的行为。 下面的机制是什么,在内联之后我得到了错误 编辑: 决定添加一些评论来强调我的想法。让我们使用

我有这样一段代码:

 Stream<Supplier<String>> stream = Stream.of(() -> "str");
 stream.map(Supplier::get).findFirst();
但我得到了:

不兼容类型:无法推断类型变量T

无效的方法引用无法引用非静态方法get() 从静态上下文

我感到困惑,因为我认为内联代码不会改变它的行为。 下面的机制是什么,在内联之后我得到了错误

编辑: 决定添加一些评论来强调我的想法。让我们使用简明代码,例如:

Stream<Integer> stream = Stream.of(1, 2);
stream.of(1, 2).map(i -> i * i).findFirst();
这是正常的,那么为什么上面的例子(不起作用)?

在我的例子中,行:

Stream.of(() -> "str").map(Supplier::get).findFirst();
为我提供编译错误
“类型流的(()->{})方法未定义”
。它给出了编译错误,因为它无法推断类型。但是当您使用
Stream=Stream.of(()->“str”)它自动从参考变量DeClearanation推断类型。有关泛型类型推断的更多信息,请访问

Stream.of(()->“str”).map(Supplier::get).findFirst();

将按预期工作。

我得到的是“不兼容类型:无法推断类型变量(s)T”,而不是“无效方法引用”。这可能是因为它无法推断流的类型。尝试
Stream.of(()->“str”).map(Supplier::get).findFirst()确定,但这段代码是否编译:
Stream=Stream.of(()->“str”);stream.map(Supplier::get).findFirst()->是。那么,为什么将
stream
替换为
stream.of(()->“str”)
会产生错误呢?@Bartek这是因为当您只有
stream.of(()->“str”)
()->“str”)时,Java不知道适用于lambda表达式的确切函数接口
并非始终是
供应商
,它可以是任何具有
字符串someMethodName()
抽象方法的功能接口。如果您将其分配给
流>
变量,则它会根据该变量进行推断。
Stream.of(1, 2).map(i -> i * i).findFirst();
Stream.of(() -> "str").map(Supplier::get).findFirst();
Stream.<Supplier<String>>of(() -> "str").map(Supplier::get).findFirst();