【问题标题】:Why is java not able to infer types for functional interfaces, but still work for regular statements?为什么 java 不能推断函数接口的类型,但仍然适用于常规语句?
【发布时间】:2020-12-08 20:36:57
【问题描述】:

我正在使用 java 中的函数式接口,现在我正在尝试定义一个 longfunction 来做一些简单的事情,比如添加数字或其他什么。

但是,如果我尝试这样做,同时将 Integer 作为 longfunction 的类型,如下所示:

LongFunction<Integer> i = (l) -> l + l;

但是这不起作用,我的编译器抱怨说“lambda 表达式中的返回类型错误:long 无法转换为整数”。如果 long 通常无法转换为整数,这将是有意义的。

但我完全能够做到这一点:

    int a = 1;
    int b = 5;
    long l = a +b;

这是为什么?为什么 java 完全能够将 long 转换为 int,反之亦然,但在 lambda 中却要严格得多?

【问题讨论】:

  • 您可以自动将整数转换为长整数,但不能自动将长整数转换为整数,因为这会导致数据丢失。
  • ab 明确声明为int 时,是什么让您认为Java 在第二个sn-p 中将长整数转换为整数?

标签: java functional-interface


【解决方案1】:

为什么 java 能够完美地将 long 转换为 int 和其他 一路走来……

不是。它会将int 转换为long,这是您的第二个sn-p 显示的内容。它不会做相反的事情。

这会产生编译错误:

    long a = 1;
    long b = 5;
    int l = a +b;

由于并非所有long 值都可以存储在int 中,因此不支持此方向的转换。

【讨论】:

    【解决方案2】:

    您的示例是将整数转换为长整数,这是一种扩展操作,不会导致信息丢失。所以没有问题。从 long 转换为 int 可能会导致信息丢失,因此需要进行强制转换。

    interface MyBiFunction<R,S,T>{
            public T apply(R a, S b);
    }
    

    即使返回类型为 long,以下内容也适用于 int 和 long。

    MyBiFunction<Integer, Long, Long> fnc1 = (a,b)-> a * b;
    long intresult1 = fnc1.apply(10,20L);
    long longresult1 = fnc1.apply(10,20l);
    

    但这不会,因为在将 lambda 转换为 long 以获得最终结果之前,这将是一个缩小操作。

    MyBiFunction<Integer, Long, Integer> fnc2 = (a,b)-> a * b;
    long longresult2 = fnc2.apply(10,20l);
    
    which is the same as 
    
    int a = 10; // ok
    long b = 20L; //ok
    int v = a*b; //  problem  long*int = long.  Can't assign to int without cast
    long longresult2 = v; //ok
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      相关资源
      最近更新 更多