【发布时间】:2019-11-29 16:38:54
【问题描述】:
我偶然发现了 AssertJ 在其中一个断言类中生成以下代码的问题:
public S hasItems(interface ItemInterface... items)
这当然不能编译。
导致问题的示例代码如下:
public interface EntityInterface {
Set<? extends ItemInterface> getItems();
}
@NoArgsConstructor
@AllArgsConstructor
@Data
@With
public class EntityA implements EntityInterface {
private Set<ItemA> items;
}
@NoArgsConstructor
@AllArgsConstructor
@Data
@With
public class EntityA implements EntityInterface {
private Set<ItemA> items;
}
public interface ItemInterface {
String getName();
}
public class ItemA implements ItemInterface {
public String getName() {
return "ItemA";
}
}
public class ItemA implements ItemInterface {
public String getName() {
return "ItemA";
}
}
我已包含导致此错误的最小示例项目,因此可以直接看到。可以从filebin下载
我们正在使用 Lombok 的 @With 注释以及其他考虑因素,并且需要保留接口。
为了解决这个问题,我已经尝试过:
- 将 getItems 方法签名更改为:
<T extends ItemInterface> Set<T> getItems();
产生:
public S hasItems(T... items)
但是 T 在上下文中是未知的。
- 使用以下方法将界面转换为模板:
public interface EntityInterface<T extends ItemInterface>
这没有任何区别。
有我缺少的解决方案吗?
【问题讨论】: