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();