gpt4 book ai didi

java - 为什么必须为方法引用显式指定类/对象名称?

转载 作者:行者123 更新时间:2023-12-02 00:13:28 25 4
gpt4 key购买 nike

当我想引用当前范围内的方法时我仍然需要在 :: 之前指定类名(对于静态方法)或 this运算符(operator)。例如,我需要写:

import java.util.stream.Stream;

public class StreamTest {
public static int trimmedLength(String s) {
return s.trim().length();
}

public static void main(String[] args) {
System.out.println(Stream.of(" aaa ", " bb ", " c ")
.mapToInt(StreamTest::trimmedLength).sum());
}
}

对于 this 来说这并不是什么大问题,但有时静态方法看起来过于拥挤,因为类名可能很长。如果编译器允许我简单地编写 ::trimmedLength ,那就太好了:

public static void main(String[] args) {
System.out.println(Stream.of(" aaa ", " bb ", " c ")
.mapToInt(::trimmedLength).sum());
}

但是 Java-8 编译器不允许这样做。对我来说,如果类/对象名称以与正常方法调用相同的方式解析,那么它似乎会非常一致。这还支持方法引用的静态导入,这在某些情况下也很有用。

所以问题是为什么 Java 8 中没有实现这样或类似的语法?这样的语法会产生什么问题吗?或者根本就没有考虑过?

最佳答案

我不能代表 Java 开发人员发言,但有一些事情需要考虑:

有一些kind of method references :

  1. 对静态方法的引用,例如ContainingClass::staticMethodName
  2. 对特定对象的实例方法的引用,例如containingObject::instanceMethodName
  3. 对特定类型的任意对象的实例方法的引用,例如ContainingType::methodName
  4. 对构造函数的引用,例如ClassName::new

编译器已经必须做一些工作来消除形式 1 和 3 以及 sometimes it fails 的歧义。 。如果形式::methodName被允许,编译器必须消除三种不同形式之间的歧义,因为它可以是从 1 到 3 的三种形式中的任何一种。

也就是说,允许使用 ::methodName 形式简化形式 1 到 3 中的任何一个仍然不意味着它等同于形式 methodName(…)作为表达式 simpleName ( arg<sub>opt</sub> )可引用

  • 当前类或其父类(super class)和接口(interface)范围内的实例方法
  • 一个static当前类或其父类(super class)范围内的方法
  • 外部类或其父类(super class)和接口(interface)范围内的实例方法
  • 一个static外部类或其父类(super class)范围内的方法
  • 一个static通过 import static 声明的方法

所以说“::name”应该允许引用任何方法 name(…)可能引用”意味着结合这两个列表的可能性,您在许愿之前应该三思而后行。

<小时/>

最后一点,您仍然可以选择编写 lambda 表达式,如 args -> name(args)这意味着解决 name就像 name(args) 形式的简单方法调用同时解决歧义问题,因为它消除了方法引用类型的选项 3,除非您明确编写 (arg1, otherargs) -> arg1.name(otherargs) .

关于java - 为什么必须为方法引用显式指定类/对象名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30251867/

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