转换为编译时未知的泛型类型

时间:2018-06-18 09:25:24

标签: java generics casting

所以,我遇到了一个问题,即转换为未知(在运行时)泛型方法参数。

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?)

甚至可以做这样的事情吗?

2 个答案:

答案 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对象。