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

为什么方法引用在场景1中显示编译器错误,但在场景2中有效?

王飞虎
2023-03-14

我创建了以下列表

   List<Integer> list = Arrays.asList(4, 5, -2, 0, -3, -1, -5, -4);
    

方案1

此行不起作用。显示编译器错误

    System.out.println(list.stream()
            .sorted(Comparator.comparing(Math::abs).thenComparing(Integer::intValue))
            .collect(Collectors.toList()));
    

方案2

但是当我们交换Math::abs整数::intValue的位置时,下面的行可以正常工作

System.out.println(list.stream()
                .sorted(Comparator.comparing(Integer::intValue).thenComparing(Math::abs))
                .collect(Collectors.toList()));

方案3

当abs函数对象替换为abs函数对象时,该行也能正常工作

Function<Integer, Integer> byAbs = Math::abs;

System.out.println(list.stream()
                .sorted(Comparator.comparing(byAbs).thenComparing(Integer::intValue))
                .collect(Collectors.toList()));

方案4

当我将Math::abs替换为(整数x)时,此行也可以正常工作-

System.out.println(list.stream()
            .sorted(Comparator.comparing((Integer x)-> Math.abs(x)).thenComparing(Integer::intValue))
            .collect(Collectors.toList()));

方案5

如果我删除,请再次执行此操作。然后从比较器中比较(Integer::intValue),它工作正常。

System.out.println(list.stream()
                .sorted(Comparator.comparing(Math::abs))
                .collect(Collectors.toList()));

编译器在比较器上显示错误。比较(数学::abs),它指出:

  • 无法推断类型参数

背后的实际逻辑是什么?

共有1个答案

程昕
2023-03-14

这类似于编译器在使用方法引用解决重载方法时遇到的问题,如中所述http://openjdk.java.net/jeps/302(可选部分:更好地消除函数表达式的歧义)。

这适用于这里,因为数学。abs有许多过载。

 类似资料:
  • 问题内容: 我有一个使用javafx Scene来渲染某些东西的应用程序,并且我想将该渲染结果放入我在Javafx中创建的某些GUI中。我该怎么做? 基本上,有一些容器可以放入场景,然后将其放入GUI。 抱歉,如果是新手问题,我是JavaFX的新手 问题答案: 该场景只有一个顶级父节点作为根。您可以获取它并放入另一个场景。

  • 本文将介绍使用 场景编辑器 创建和编辑场景图像时的工作流程和技巧。 使用节点创建菜单快捷添加基本节点类型 当我们开始在场景中添加内容时,一般会先从 层级管理器 的 创建节点菜单 开始,也就是点击左上角的 + 按钮弹出的菜单,从几个简单的节点分类中选择我们需要的基础节点类型并添加到场景中。 添加节点时,在 层级管理器 中选中的节点将成为新建节点的父节点,如果你选中了一个折叠显示的节点然后通过菜单添加

  • 本文向大家介绍vue中mixins有什么使用场景?相关面试题,主要包含被问及vue中mixins有什么使用场景?时的应答技巧和注意事项,需要的朋友参考一下 一般一些有重复方法的组件,可以考虑抽一个mixin。 或者是比如一些页面权限控制的内容,也可以考虑抽一个mixin

  • 通过使用此链接在Eclipse中安装新软件,我已经安装了场景构建器(e(fx)clipse 2.4.0)。我还尝试过使用Eclipse Marketplace进行安装,这两种方法都给了我错误,当我尝试编辑一些东西时,它给了我这个错误: 我已经在我的系统上到处搜索了绝对路径,有些人说它在: 我正在使用: Eclipse 4.6.3 基于Antergos-Arch Linux的发行版

  • 我想在一个扩展场景的类中画一张画布。当我按下场景上的按钮时,这个场景应该显示出来,这个场景是在扩展的类“GUI”中创建的。 为设置图像(我不知道要将ImageView作为子节点添加到哪个节点{类似不起作用}) 试图在画布上画画。(与上面的问题相同。在哪里添加此画布?) 类: 和类: PS:Jeah!我在这个论坛上的第一个问题。你好世界!

  • 本文向大家介绍AudioContext有什么应用场景?相关面试题,主要包含被问及AudioContext有什么应用场景?时的应答技巧和注意事项,需要的朋友参考一下 AudioContext实例有createAnalyzer(),可以实现音频可视化,还有一个gainNode,可以实现输入(MediaStream or HTMLMediaElement)音量的range调整