我正在努力了解在为通用类型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?,但没有一个人更明智。
答案 0 :(得分:1)
未经检查的警告不是您的错。由于API的实施不正确,因此无法保留通用信息。关于此问题,存在一个未解决的问题:JDK-8152399。该问题被标记为“增强”,但我认为这是一个错误。
该问题是由于JavaBeanObjectPropertyBuilder
的几乎所有方法都返回原始类型引起的。唯一的例外是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
的方法签名。它们都返回通用类型。