代码之家  ›  专栏  ›  技术社区  ›  Aidenhjj

泛型JavaBeanObjectProperty的未检查分配错误,但ReadOnlyJavaBeanObjectProperty的未检查分配错误

  •  0
  • Aidenhjj  · 技术社区  · 6 年前

    在为泛型类型T构建JavaBeanObjectProperty时,我很难理解我需要做些什么才能不丢失类型信息。一个有趣的细节是,对于ReadOnlyJavaBeanObjectProperty,我没有从IntelliJ得到这个警告。

    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 generic Java Generics, how to avoid unchecked assignment warning when using class hierarchy? 我一点也不聪明。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Slaw    6 年前

    未解决 与此相关的问题: JDK-8152399 . 这个问题被标记为“增强”,但我认为它是一个bug。

    这个问题是由几乎所有的方法造成的 JavaBeanObjectPropertyBuilder 返回 原始类型 build 它回来了 JavaBeanObjectProperty<T> . 不过,这没关系,因为当你打电话的时候 你打电话时丢失了类型信息 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 . 这是个很好的实践 @抑制警告


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