Vavr 注释处理工具无法启动



我正试图从这里复制一个简单的对象分解示例。我在我的项目中添加了以下依赖项:

<dependency>
<groupId>io.vavr</groupId>
<artifactId>vavr</artifactId>
<version>${vavr.version}</version>
</dependency>
<dependency>
<groupId>io.vavr</groupId>
<artifactId>vavr-match</artifactId>
<version>${vavr.version}</version>
</dependency>
<dependency>
<groupId>io.vavr</groupId>
<artifactId>vavr-match-processor</artifactId>
<version>${vavr.version}</version>
</dependency>

其中vavr.version0.10.3,并且已经复制粘贴了来自上述来源的示例:

import io.vavr.Tuple;
import io.vavr.Tuple2;
import io.vavr.match.annotation.Patterns;
import io.vavr.match.annotation.Unapply;
import lombok.AllArgsConstructor;
import lombok.Getter;
import static io.vavr.API.$;
import static io.vavr.API.Match;
import static io.vavr.API.Match.*;
public class Example {
@Getter
@AllArgsConstructor
public static class Employee {
private String name;
private String id;
}
@Patterns
public static class Demo {
@Unapply
static Tuple2<String, String> Employee(Employee Employee) {
return Tuple.of(Employee.getName(), Employee.getId());
}
}
public static void main(String[] args) {
Employee person = new Employee("Carl", "89696D8");
String result = Match(person).of(
Case(Demo.Employee($("Carl"), $()), (name, id) -> ""),
Case($(), () -> "notfound")
);
}
}

然而,第一个Case产生了一个编译错误Expected 1 argument but found 2,这向我表明注释处理不起作用,也没有生成相应的模式。如果我错了,请纠正我。

我正在使用Intellij 2020.1,并在中启用了注释处理

原因是您在这一行中使用了生成类的无效名称:

Case(Demo.Employee($("Carl"), $()), (name, id) -> "")

应替换为:

Case(Example_DemoPatterns.$Employee($("Carl"), $()), (name, id) -> name + " " + id)

由于Demo是一个静态嵌套类,它需要以Example_为前缀,并且由于这是生成器的工作方式,它需要用Patterns作为后缀。

这里有一个完整的、可构建的示例,您可以克隆并试用它。它包含maven和gradle的示例。为了验证它是如何工作的,将提到的行更改为例如:

Case(Example_DemoPatternsWhatever.$Employee($("Carl"), $()), (name, id) -> name + " " + id)

然后运行:

mvn exec:java

它失败了(没有生成这样的类(,但当你运行tree target/时,你会得到这样的结果:

target
├── classes
├── generated-sources
│   └── annotations
│       └── Example_DemoPatterns.java
└── maven-status
└── maven-compiler-plugin
└── compile
└── default-compile
├── createdFiles.lst
└── inputFiles.lst

这意味着类确实生成了。这是您需要使用的类。

最新更新