Я наткнулся на проблему, когда 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>
что не имело никакого значения.
Есть ли решение, которое мне не хватает?