Java Lombok.val实际上是如何工作的?

Java Lombok.val实际上是如何工作的?,java,annotations,lombok,Java,Annotations,Lombok,允许您 使用val作为局部变量声明的类型,而不是 实际上是在写类型。执行此操作时,将从初始值设定项表达式推断类型。局部变量也将成为最终变量 所以不是 final ArrayList<String> example = new ArrayList<String>(); 如果这些用法不是注释,而是注释类型,Lombok如何处理它们?根据我(显然不正确)的理解,语法应该更像: @Val foo = new ArrayList<String>(); @Val fo

允许您

使用val作为局部变量声明的类型,而不是 实际上是在写类型。执行此操作时,将从初始值设定项表达式推断类型。局部变量也将成为最终变量

所以不是

final ArrayList<String> example = new ArrayList<String>();
如果这些用法不是注释,而是注释类型,Lombok如何处理它们?根据我(显然不正确)的理解,语法应该更像:

@Val foo = new ArrayList<String>();
@Val foo=new ArrayList();

(我知道注释的约束意味着上面的语法无效)

为了让Lombok工作,源代码需要无错误地解析。这就是为什么,正如您已经提到的,
@val foo=new ArrayList()不起作用

尽管Lombok使用注释和注释处理器,但注释处理器仅用作编译器参与的一种手段

Lombok没有为
@val
注册的处理器。相反,它处理所有java文件,访问整个AST,并用局部变量的初始化表达式类型替换
val

对于Eclipse/ecj的实际替换,请参见和。有关javac,请参阅


披露:我是一名Lombok开发人员。

我知道Lombok.val应该出现在局部变量-方法局部变量中。为什么它不能在类和实例级别工作。我真的很喜欢lombok for java引入的通过类型推断实现类似scala的约定的想法-就像在'val'和'var'中一样,这并没有解释(至少对我来说)如何
val example=new ArrayList()
不会因
错误而失败:不兼容的类型:ArrayList无法转换为val
(这是我所期望的,因为val并没有被声明为
ArrayList
的超类型)。但据我所知,这是因为在lombok启动时,AST已被解析,但尚未进行编译,即只检查了语法,而没有检查逻辑。
public class Main
{
    public @interface Foo { }

    public static void main(String... args)
    {       
        Foo bar;
        System.out.println("End");
    }
}
@Val foo = new ArrayList<String>();