在我开始之前,我想说明一下:我已经尽力去寻找与Java泛型和动态类型转换相关的问题线索了。如果我有所疏漏,敬请谅解。
类型Scalar的定义如下:
public class Scalar <T extends Number> {
public final String name;
T value;
...
public T getValue() {
return value;
}
public void setValue(T val) {
this.value = val;
}
}
我希望有一个像这样的方法:
```
public void evilSetter(V val) {
this.value = (T) val;
}
当然,这通常是不被鼓励的。我需要这样一个方法的原因是,我有一组标量的值,我希望稍后更改它们。然而,一旦它们进入集合中,它们的泛型类型参数就不再可访问。因此,即使我想要进行在运行时完全有效的赋值,也无法知道它是否在编译时有效,无论是否使用泛型。
Map<String, Scalar<? extends Number>> scalars = ...;
Scalar<? extends Number> scalar = scalars.get("someId");
// None of this can work
scalar.value = ...
scalar.setValue(...)
那么我该如何实现一个带有检查的转换和设置方法呢?
public <V extends Number> void castAndSet(V val) {
// One possibility
if (this.value.getClass().isAssignableFrom(val.getClass()) {
// Some cast code here
}
// Another
if (this.value.getClass().isInstanceOf(val) {
// Some cast code here
}
// What should the cast line be?
// It can't be:
this.value = this.value.getClass().cast(val);
// Because this.value.getClass() is of type Class<?>, not Class<T>
}
所以我只能使用
。
this.value = (T) val;
还会遇到ClassCastException异常吗?