Непроверенная ошибка Назначения для универсального JavaBeanObjectProperty, но не для ReadOnlyJavaBeanObjectProperty - PullRequest
0 голосов
/ 02 ноября 2018

Я изо всех сил пытаюсь понять, что мне нужно сделать, чтобы не потерять информацию о типе при создании JavaBeanObjectProperty для универсального типа T. Одна интересная деталь заключается в том, что я не получаю это предупреждение от IntelliJ для ReadOnlyJavaBeanObjectProperty.

public class FooWrapper<T> {
    /**
     * Decorates a Foo instance with javafx stuff
     */
    private final Foo foo;

    private final JavaBeanObjectProperty<T> value;
    private final ReadOnlyJavaBeanObjectProperty<T> type;

    public ParameterWrapper(Foo toWrap) {
        this.foo = toWrap;
        try {
            this.value = new JavaBeanObjectPropertyBuilder<T>()
                    .bean(this.foo)
                    .name("value")
                    .build();
            this.type = new ReadOnlyJavaBeanObjectPropertyBuilder<T>()
                    .bean(this.foo)
                    .name("type")
                    .build();
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        }
    }
}

Я прочитал Непроверенная операция Java, приведенная к универсальным и Обобщениям Java, как избежать предупреждения о непроверенном присваивании при использовании иерархии классов? и не мудрее.

1 Ответ

0 голосов
/ 02 ноября 2018

Непроверенные предупреждения - это не ваша вина. Общая информация не сохраняется, потому что API был плохо реализован. Существует нерешенная проблема, связанная с этим: JDK-8152399 . Проблема помечена как «улучшение», но я бы посчитал это ошибкой.

Проблема вызвана тем, что почти все методы JavaBeanObjectPropertyBuilder возвращают необработанные типы . Единственным исключением является build, который возвращает JavaBeanObjectProperty<T>. Однако это не имеет значения, потому что к тому времени, когда вы позвонили build, вы потеряли информацию о типе из-за вызова bean и name. К сожалению, это означает, что вы ничего не можете сделать, чтобы законно избавиться от предупреждения - вы можете только подавить его.

public class FooWrapper {

  private final Foo delegate;

  private final JavaBeanObjectProperty<SomeType> value;

  @SuppressWarnings("unchecked") // Reason: Bad API
  public FooWrapper(Foo delegate) {
    this.delegate = delegate;
    try {
      value = JavaBeanObjectPropertyBuilder.create()
          .bean(delegate)
          .name("value")
          .build();
    } catch (NoSuchMethodException ex) {
      throw new RuntimeException(ex);
    }
  }

}

Используется @SuppressWarnings для подавления непроверенных предупреждений. Вы можете прочитать больше об этом здесь . Рекомендуется применять @SuppressWarnings к самой узкой области видимости, чтобы избежать других полезных предупреждений.


Для сравнения посмотрите на сигнатуры методов ReadOnlyJavaBeanObjectPropertyBuilder. Все они возвращают универсальный тип.

...