如何在静态导入上使用方法引用?

2022-09-01 10:57:57

在java中使用映射函数时,我可以执行以下操作:

import com.example.MyClass;

someStream.map(MyClass::myStaticMethod)

但是在我的项目中,我们有时会使用静态导入,当导入是静态的时,我该如何引用myStaticMethod?

我认为这会起作用,但它没有:

import static com.example.MyClass.myStaticMethod;

someStream.map(myStaticMethod); //does not compile

为什么这不起作用?我是否“坚持”使用第一个示例,或者是否有其他解决方案。


答案 1

让我们看一下 Java 语言规范 15.13 的相关部分。方法引用表达式

它列出了创建方法引用的以下方法:

MethodReference:
  ExpressionName :: [TypeArguments] Identifier 
  ReferenceType :: [TypeArguments] Identifier 
  Primary :: [TypeArguments] Identifier 
  super :: [TypeArguments] Identifier 
  TypeName . super :: [TypeArguments] Identifier 
  ClassType :: [TypeArguments] new 
  ArrayType :: new

请注意,它们都包含一个令牌。::

因为 参数不包含 ,它不是一个有效的方法引用。someStream.map(myStaticMethod)::

这表明您确实需要导入(如果这是您的首选项,则可能除了静态导入之外),并将该方法引用为 .MyClassMyClass::myStaticMethod


答案 2

好吧,它没有编译,因为JLS是这么说的。但这甚至无法编译,因为它将是一个普通的方法调用,而不是一个方法引用 - 它仅使用符号定义,无论是静态还是使用的实例。::

这仍然是一个有趣的方面,一个你无法解决的方面 - 可能是目前。没有语言支持来定义如下内容:

MethodRef <Class, Method> ref = ...

稍后以您想要的方式使用它。但我甚至不认为这是不可能的,因为你还必须以某种方式定义参数类型和返回类型,因为需要这样做来查看它是否与多个其他地方匹配。喜欢,这可能适用于相同的.Predicate<String>Function<String, Boolean>method reference


推荐