所以,我遇到了一个问题,即转换为未知(在运行时)泛型方法参数。
ValueDescription<?> valueDesc = /* get the value description */;
Object value = /* get the value */;
valueDesc.gotAValue(valueDesc.getType().cast(value));
抽象类ValueDescription如下所示:
public abstract class ValueDescription<T> {
public abstract Class<T> getType();
public void gotAValue(final T value) {
// do something
}
}
Eclipse总是给出以下错误:
ValueDescription类型中的方法gotAValue(捕获#1-of?)不适用于参数(捕获#2-of?)
甚至可以做这样的事情吗?
答案 0 :(得分:1)
将此代码放入通用方法中:
<T> void doStuff(ValueDescription<T> valueDesc) {
Object value = /* get the value */;
valueDesc.gotAValue(valueDesc.getType().cast(value));
}
这允许编译器知道getType()
和gotAValue
“?
s”是相同的类型,即使您不直接知道T
:
ValueDescription<?> valueDesc = /* get the value description */;
doStuff(valueDesc); // Fine, even though you've only got ?.
答案 1 :(得分:1)
如果您不应该知道ValueDescription
的实际泛型类型,那么您应该让课程为您完成。
public abstract class ValueDescription<T> {
public abstract Class<T> getType();
public void gotAValue(final Object value) {
final T castedValue = getType().cast(value);
// Continue
}
}
如果这样做,如果Object
类型value
无法转换为实际类型,则可能需要抛出相应的异常。
如果可以确定valueDesc
的类型,请使用Andy's solution。
实际上,如果您不知道ValueDescription
的类型,则该类可能根本不需要通用。 getType()
只需返回Class<?>
,子类只需覆盖它即可返回正确的Class
对象。