在Java中的隐式参数

我在Java 8中找到了一个让我感兴趣的方法,它是添加在Parameter这个类中的。

isImplicit() | 参数 (Java 8 平台)

如果该参数在源代码中是隐式声明的,则返回true;否则返回false。

在Java中有隐式参数吗?

在Java中也能够做到类似于Scala中implicit的东西吗?

具有 isImplicit() 为真的东西

经过调查,似乎不能像 Scala 的 implicit 那样做。

import java.lang.reflect.Constructor;
import java.lang.reflect.Parameter;

public class Main {

    public static void main(String[] args) throws Exception {
        Constructor<InnerClass> constructor = InnerClass.class.getConstructor(Main.class);
        Parameter parameter = constructor.getParameters()[0];

        System.out.println(
            "name : " + parameter.getName() + "\n" +
            "implicit : " + parameter.isImplicit()
        );
    }

    public class InnerClass {}
}

使用「-parameters」选项进行编译

$ javac -parameters Main.java

一旦执行,

$ java Main
name : this$0
implicit : true

这样就会变成这样。

从非静态内部类的默认构造函数获取参数时,isImplicit()返回true。

据说发生的情况是,非静态内部类在编译时会生成如下代码。

public class InnerClass {
    private Main parent;
    public InnerClass(final Main this$0) {
        this.parent = this$0;
    }
}

这样一来,即使在源代码上没有明确写出,但在编译时生成的参数被称为隐式参数。(我对英语的解读可能不准确)
(顺便说一句,如果在编译时没有指定 -parameters 选项,isImplicit()就会返回false)

如果 isImplicit() 是true,那么还有一个选择是使用 enum 的 valueOf()。

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class Main {

    public static void main(String[] args) throws Exception {
        Method valueOf = MyEnum.class.getMethod("valueOf", String.class);
        Parameter parameter = valueOf.getParameters()[0];

        System.out.println(
            "name : " + parameter.getName() + "\n" +
            "implicit : " + parameter.isImplicit()
        );
    }

    public static enum MyEnum {}
}
name : name
implicit : true

请参考

    Implicit and Synthetic Parameters | Obtaining Names of Method Parameters (The Java™ Tutorials > The Reflection API > Members)