【发布时间】:2021-04-04 21:10:59
【问题描述】:
我有一个接口,它定义了一个 id 字段(和其他字段,但很简单),它使用 Java 的泛型。
我正在使用 Lombok 为实现此功能的类生成 Getter 和 Builder。
在界面中使用IdType getId(),Lombok 将同时生成Object getId() 和UUID getId()。这两种方法都可以在通过反射调用时工作,但它非常奇怪,并且搞砸了一些假设一个类不会有多个具有相同名称和不同返回类型的方法的代码。
(我
这是一个显示此行为的单元测试。我的龙目岛错了吗?我需要申请其他注释吗?我是否只是耸耸肩并编写代码让所有吸气剂检查并避免它?
Java 8,Lombok 1.18.16,当前是最新的。
public class LombokGeneratesDuplicateMethodsTest {
interface WithId<IdType> {
IdType getId();
}
@Getter
@Builder
static class Record implements WithId<UUID> {
private UUID id;
private String name;
}
@Test
public void testStuff() throws Exception {
Collection<Method> getIds = Arrays.stream(Record.class.getDeclaredMethods())
.filter(m -> Modifier.isPublic(m.getModifiers()))
.filter(m -> !Modifier.isStatic(m.getModifiers()))
.filter(m -> !Void.TYPE.equals(m.getReturnType()))
.filter(m -> m.getParameterTypes().length == 0)
.filter(m -> m.getName().equals("getId"))
.collect(Collectors.toList());
assertThat(getIds.size()).isEqualTo(2); // This seems wrong...
UUID someId = UUID.randomUUID();
Record record = Record.builder().id(someId).name("Gunter").build();
for (Method getId : getIds) {
assertThat(getId.invoke(record)).isEqualTo(someId);
}
WithId<UUID> withId = record;
assertThat(withId.getId()).isEqualTo(someId);
assertThat(record.getId()).isEqualTo(someId);
}
}
【问题讨论】:
-
看看stackoverflow.com/questions/6204339/…,好像你也需要过滤isBridge()