当前位置: 首页 > 知识库问答 >
问题:

lambda表达式中的错误返回类型

尉迟龙光
2023-03-14

以下代码在IntelliJ和Eclipse中编译得很好,但JDK编译器1.8.0\u 25对此表示不满。首先,代码。

import java.util.function.Predicate;

public abstract class MyStream<E> {

  static <T> MyStream<T> create() {
    return null;
  }

  abstract MyStream<E> filter(MyPredicate<? super E> predicate);

  public interface MyPredicate<T> extends Predicate<T> {

    @Override
    boolean test(T t);
  }

  public void demo() {
    MyStream.<Boolean> create().filter(b -> b);
    MyStream.<String> create().filter(s -> s != null);
  }
}

javac 1.8.0\u 25的输出为:

MyStream.java:18: error: incompatible types: incompatible parameter types in lambda expression
    MyStream.<Boolean> create().filter(b -> b);
                                       ^
MyStream.java:18: error: incompatible types: bad return type in lambda expression
    MyStream.<Boolean> create().filter(b -> b);
                                            ^
    ? super Boolean cannot be converted to boolean
MyStream.java:19: error: bad operand types for binary operator '!='
    MyStream.<String> create().filter(s -> s != null);
                                             ^
  first type:  ? super String
  second type: <null>
MyStream.java:19: error: incompatible types: incompatible parameter types in lambda expression
    MyStream.<String> create().filter(s -> s != null);
                                      ^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
4 errors

当我更换时?超级E只需使用E,JDK就能成功编译。

当我将filter(MyPredicate替换为filter(Predicate,JDK编译成功。

由于它适用于JDK 1.8.0_60,我怀疑它是编译器错误。

有没有详细说明是什么原因造成的以及何时修复的?

共有2个答案

巫马昆杰
2023-03-14

<代码>

MyPredicate<? super E>

可能是

MyPredicate<Object>

并且不能将对象作为布尔值返回。

尝试将lambda更改为:

MyStream.<Boolean> create().filter(b -> Boolean.TRUE.equals(b));

无论流的类型如何,它都将编译并执行无误,但对于值为布尔值的元素,它将返回true。

虞承泽
2023-03-14

如果lambda表达式出现在带有通配符的目标类型中(与大多数情况一样)

  Consumer<? super Boolean> consumer = b->{...}

问题来了——lambda表达式的类型是什么;特别是b的类型。

当然,由于通配符的缘故,可能有很多选择;e、 g.我们可以明确选择

  Consumer<? super Boolean> consumer = (Object b)->{...}

但是,隐式地,b应推断为布尔值。这是有意义的,因为无论如何,消费者应该只接受布尔值。

http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.27.3

如果T是通配符参数化的函数接口类型,并且lambda表达式是隐式类型的,则地面目标类型是T的非通配符参数化

(这可能是假设通配符在目标类型上正确使用方差;如果假设不成立,我们可能会发现一些有趣的例子)

 类似资料:
  • 将异常获取为 :lambda表达式中的返回类型错误:

  • 我正在学习Java中的Lambda并试图理解它。例如,我有以下代码: 我不理解这个语句我看到是类型的引用变量。但是我不明白这个到底是什么。这是方法定义吗?这个方法的返回类型是什么?我认为应该是,因为方法的返回类型是。如有任何反馈将不胜感激。

  • 为什么会发生异常'lambda表达式中的ad返回类型:AuthenticatedUser无法转换为User'?如果可选为空,我只想返回此AuthenticatedUser。

  • 我试图通过加速,用java流编写一个查询。当我尝试在select中时,我得到以下错误: lambda表达式中的错误返回类型:BigDecimal不能转换为long。运算符-不能应用于int、BigDecimaljava.math.。 我的代码是这样的: 我该如何解决这个问题?

  • 我正在编写一个lambda表达式来将给定的纬度和经度转换为地址。表达式应该以坐标为参数,并返回其相应的地址。但是,返回的值为null。以下是我的班级: 以下是logcat的输出: 以下是我的用法: 是类的对象,以下是相关接口: 当我尝试从相关适配器打印坐标时,它们会正确打印。因此,位置正在正确设置,但是当我试图从另一个类访问它时,它会显示字符串的空值。你能建议一个替代方法来从表达式中提取位置吗?

  • 我有一个静态的通用FormBuilder超文本标记语言助手方法(HTMLHelper类上的扩展方法),它接受视图模型类型的通用参数,然后当从数据库传递一个或多个字符串属性名称时,生成一个超文本标记语言形式在ASP. NET MVC 5.1 with. NET 4.5中。 我有一个公共方法来生成表单,还有单独的私有方法来生成表单中的“模块”部分,然后渲染其中的每个字段。类型参数从上到下沿此链传递。