我正在努力理解在为泛型类型 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 generic和 Java 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/