Неизменяемый не генерирует правильный код при использовании карты

#java

#java

Вопрос:

У меня есть этот код, использующий https://immutables.github.io /:

 @Value.Immutable
@Value.Style(visibility = Value.Style.ImplementationVisibility.PRIVATE)
public interface TypedEntityQuery<T> {
  String environment();

  T entity();

  Map<String, PropertyCondition> conditions();

  Integer offset();

  Integer max();

  String sort();
}
  
 public interface PropertyCondition {
}
  

И используется следующим образом:

 TypedEntityQuery<Manager> query = new TypedEntityQueryBuilder<Manager>()
   .entity(manager)
   .conditions(manager.getConditions()) 
   .build();
  

Приведенный выше класс manager определен как таковой:

 @Builder
class Manager {
   private @Getter @Setter Map<String, PropertyCondition> conditions;
}
  

Однако он выдает эту ошибку:

 [ERROR] .../target/generated-sources/annotations/com/mycompany/backend/model/builder/TypedEntityBuilder.java:[124,20] method put in class com.google.common.collect.ImmutableMap.Builder<K,V> cannot be applied to given types;
[ERROR]   required: java.lang.String,com.mycompany.core.PropertyCondition
[ERROR]   found: java.util.Map.Entry<java.lang.String,capture#2 of ? extends com.mycompany.core.PropertyCondition>
[ERROR]   reason: actual and formal argument lists differ in length
[ERROR] -> [Help 1]
  

Сгенерированный код:

 /**
 * Put one entry to the {@link TypedEntity#conditions() conditions} map. Nulls are not permitted
 * @param entry The key and value entry
 * @return {@code this} builder for use in a chained invocation
 */
@CanIgnoreReturnValue 
public final TypedEntityBuilder<T> putConditions(Map.Entry<String, ? extends PropertyCondition> entry) {
  this.conditions.put(entry); // error here
  return this;
}
  

Комментарии:

1. Единственный метод put в интерфейсе Map требует двух аргументов, а не одного. Разве это не то, что actual and formal argument lists differ in length означает?

2. Да, правильно, но, как вы можете видеть, это «сгенерированный код»

3. Тем не менее, сгенерированный код не компилируется. Вы всегда можете отредактировать сгенерированный код. Или возникает проблема с неизменяемыми .

Ответ №1:

Я бы добавил это в качестве комментария, но у меня нет «репутации 50».

Для тех, кто столкнется с этой проблемой позже — вы можете использовать реализацию jdkOnly, даже если у вас есть guava в пути к классу. Например

 @Value.Immutable
@Value.Style(
  visibility = Value.Style.ImplementationVisibility.PRIVATE,
  jdkOnly = true // Add this to avoid using the guava implementation
)
public interface TypedEntityQuery<T> {
  String environment();

  T entity();

  Map<String, PropertyCondition> conditions();

  Integer offset();

  Integer max();

  String sort();
}
  

Ссылка: https://immutables.github.io/style.html

Я не думаю, что это решает проблему. Мой следующий лучший выбор — вам нужно проверить версию guava, которую вы используете. Может быть, вам нужно добавить версию, в которой есть то, что вы хотите?