【问题标题】:Cast to compiletime unknown generic type转换为编译时未知的泛型类型
【发布时间】:2018-06-18 17:33:13
【问题描述】:

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

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(capture#1-of ?) 不适用于参数 (capture#2-of ?)

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

【问题讨论】:

    标签: java generics casting


    【解决方案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 ?.
    

    【讨论】:

      【解决方案2】:

      如果您不应该知道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&lt;?&gt; 并且子类只需要覆盖它以返回正确的 Class 对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-17
        • 1970-01-01
        相关资源
        最近更新 更多