gpt4 book ai didi

java - 为什么编译器不能推断 Stream.of 的内联 lambda 参数的类型?

转载 作者:行者123 更新时间:2023-12-04 11:51:25 26 4
gpt4 key购买 nike

为什么 Stream.of() 需要强制转换来获取内联 lambda 表达式或方法引用吗?
考虑一下:

 Function<String,String> f = String::toUpperCase; // works without cast
Stream.of(f); // works without cast
//Stream.of(String::toUpperCase); // Error - target type must be functional interface
Stream.of((Function<String,String>) String::toUpperCase); //OK
对变量 f 的赋值不需要强制转换,但当用作 Stream.of 的内联参数时需要强制转换。
为什么?

最佳答案

lambda 或方法引用本身没有类型,它从上下文派生其类型(例如分配给它的变量),或者换句话说,它是上下文类型的。当您使用 Stream.of(...)如果没有进一步的上下文来推断类型(例如,返回,因此类型由返回类型指定,或分配给变量或参数,或使用显式泛型参数),则没有可用于构造 lambda 或方法引用的类型信息。
原因是Java不知道你是否想要Function<String, String> ,或 UnaryOperator<String> ,或其他具有兼容签名的功能接口(interface)。
您需要执行以下操作:

public Stream<Function<String, String>> example1() {
return Stream.of(String::toUpperCase);
}

public void example2() {
Stream<Function<String, String>> stream = Stream.of(String::toUpperCase);
}

public void example3() {
Stream.<Function<String, String>>of(String::toUpperCase);
}

public void example4() {
doSomething(Stream.of(String::toUpperCase));
}

private void doSomething(Stream<Function<String, String>> stream) {
// ...
}
另见 Java Tutorial on lambdas ,特别是部分目标类型:

[...] The data type that these methods expect is called the targettype. To determine the type of a lambda expression, the Java compileruses the target type of the context or situation in which the lambdaexpression was found. It follows that you can only use lambdaexpressions in situations in which the Java compiler can determine atarget type:

  • Variable declarations
  • Assignments
  • Return statements
  • Array initializers
  • Method or constructor arguments
  • Lambda expression bodies
  • Conditional expressions, ?:
  • Cast expressions

关于java - 为什么编译器不能推断 Stream.of 的内联 lambda 参数的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69409010/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com