通用JavaBeanObjectProperty的未经检查的分配错误,但ReadOnlyJavaBeanObjectProperty则没有

时间:2018-11-02 16:01:32

标签: java javafx adapter

我正在努力了解在为通用类型T构建JavaBeanObjectProperty时不放松类型信息所需要做的事情。一个有趣的细节是,我没有从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 unchecked operation cast to genericJava Generics, how to avoid unchecked assignment warning when using class hierarchy?,但没有一个人更明智。

1 个答案:

答案 0 :(得分:1)

未经检查的警告不是您的错。由于API的实施不正确,因此无法保留通用信息。关于此问题,存在一个未解决的问题:JDK-8152399。该问题被标记为“增强”,但我认为这是一个错误。

该问题是由于JavaBeanObjectPropertyBuilder的几乎所有方法都返回原始类型引起的。唯一的例外是build,它返回JavaBeanObjectProperty<T>。不过,这无关紧要,因为到您致电build时,您已经失去了致电beanname的类型信息。不幸的是,这意味着您无法采取任何措施合法摆脱警告,您只能压制它。

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来取消未选中的警告。您可以详细了解here。最好将@SuppressWarnings应用于尽可能小的范围,以免抑制其他有用的警告。


为进行比较,请查看ReadOnlyJavaBeanObjectPropertyBuilder的方法签名。它们都返回通用类型。