它并不像看起来那么复杂。
TypeSpec.Builder 有两个版本的 addSuperInterface 方法:
TypeSpec.Builder addSuperinterface(Type superinterface)
TypeSpec.Builder addSuperinterface(TypeName superinterface)
我们可以以第二个版本为例,使用ClassName.get获取超级接口作为TypeName类的实例
ClassName 类的 get 方法的签名之一是:
public static ClassName get(String packageName, String simpleName, String... simpleNames)
所以我们可以使用空字符串作为包名,因为您没有在接口规范中指定任何包名。它将起作用,因为 ClassName extends TypeName。
另一方面,我们可以使用类型规范的 name 属性来获取接口的简单名称。
这里是一个完整的示例实现。我修改了变量的名称(您用于接口规范的变量名称 if 将不起作用,因为它是 java 关键字)。
@Data
public class SimpleClassSpecs {
public final TypeSpec interfaceSpec;
public final TypeSpec classSpec;
public SimpleClassSpecs() {
interfaceSpec = TypeSpec.interfaceBuilder("MyInterface")
.build();
TypeName interfaceTypeName = ClassName.get("", interfaceSpec.name);
classSpec = TypeSpec.classBuilder("MyClass")
.addSuperinterface(interfaceTypeName)
.build();
}
}
我使用 Lombok 的 @Data 作为样板代码(getter 和 setter...)
下面是一个对应的测试(用assertj写的断言):
@Test
public void should_generate_spec_with_superInterface() {
SimpleClassSpecs ps = new SimpleClassSpecs();
assertThat(ps.classSpec.toString()).contains("class MyClass implements MyInterface");
}
或者简单地做一个System.out.println(ps.classSpec),可以得到如下结果:
类 MyClass 实现 MyInterface {
}