java - 通用 JavaBeanObjectProperty 的未检查赋值错误,但 ReadOnlyJavaBeanObjectProperty 则不然

标签 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?我却一无所知。

最佳答案

未经检查的警告不是你的错。由于 API 实现不佳,通用信息未保留。有一个与此相关的未解决问题:JDK-8152399 。该问题被标记为“增强”,但我认为它是一个错误。

该问题是由 JavaBeanObjectPropertyBuilder 的几乎所有方法引起的。返回原始类型。唯一的异常(exception)是 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 抑制未经检查的警告。您可以阅读更多相关信息here 。申请 @SuppressWarnings 是一个很好的做法尽可能缩小范围,以避免抑制其他有用的警告。

<小时/>

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

关于java - 通用 JavaBeanObjectProperty 的未检查赋值错误,但 ReadOnlyJavaBeanObjectProperty 则不然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53122020/

相关文章:

java - git 文件中的奇怪名称

java - Spring 3 Service Dao 层与抽象类问题

JavaFX 样式类不会刷新

android - retrofit2 和 rxjava3 : java. lang.IllegalArgumentException : Could not locate call adapter for io. reactivex.rxjava3.core.Observable

java - Java Web 应用程序中的 Ajax 和复杂图形

java - 将图像作为多部分文件接收到休息服务

java - 如何从 MySQL DATETIME 转换为 java.time.Instant 并以系统默认时区显示给用户?

JavaFX - 如何检查可编辑 TableView 中的用户输入

android - 自定义 SimpleCursorAdapter、数据库查询和 NullPointerException

php - zend 新手问题 - "No adapter found for "