泛型JavaBeanObjectProperty的未选中分配错误,但ReadOnlyJavaBeanObjectProperty的未选中分配错误

泛型JavaBeanObjectProperty的未选中分配错误,但ReadOnlyJavaBeanObjectProperty的未选中分配错误,java,javafx,adapter,Java,Javafx,Adapter,在为泛型类型T构建JavaBeanObjectProperty时,我很难理解我需要做什么才能不丢失类型信息。一个有趣的细节是,我没有从IntelliJ获得ReadOnlyJavaBeanObjectProperty的此警告 public class FooWrapper<T> { /** * Decorates a Foo instance with javafx stuff */ private final Foo foo; priva

在为泛型类型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);
        }
    }
}
公共类FooWrapper{
/**
*用javafx东西装饰Foo实例
*/
私人决赛福福;
私有最终JavaBeanObject属性值;
私有最终只读JavaBeanObject属性类型;
公共参数包装器(Foo-toWrap){
this.foo=toWrap;
试一试{
this.value=newjavabeanObjectPropertyBuilder()
.bean(this.foo)
.名称(“价值”)
.build();
this.type=new ReadOnlyJavaBeanObjectPropertyBuilder()
.bean(this.foo)
.名称(“类型”)
.build();
}捕获(无此方法例外){
抛出新的运行时异常(e);
}
}
}

我读过,但一点也不明白。

未经检查的警告不是你的错。由于API的实现很差,因此没有保留通用信息。存在与此相关的未解决问题:。这个问题被标记为“增强”,但我认为它是一个bug。 这个问题是由几乎所有返回原始类型的方法所导致的。唯一的例外是
build
,它返回
JavaBeanObjectProperty
。但是,这并不重要,因为在调用
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);
    }
  }

}
公共类FooWrapper{
非公开最终Foo代表;
私有最终JavaBeanObject属性值;
@SuppressWarnings(“未选中”)//原因:API错误
公共FooWrapper(Foo委托){
this.delegate=委托;
试一试{
value=JavaBeanObjectPropertyBuilder.create()
.bean(代表)
.名称(“价值”)
.build();
}catch(NoSuchMethodException-ex){
抛出新的运行时异常(ex);
}
}
}
这用于抑制未检查的警告。你可以阅读更多关于它的内容。最好将
@SuppressWarnings
应用到尽可能窄的范围内,以避免抑制其他有用的警告


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