【问题标题】:Implement interface with method returning class of type parameter使用类型参数的方法返回类实现接口
【发布时间】:2014-01-14 21:48:54
【问题描述】:

我有一个第 3 方接口 Converter<PRESENTATION, MODEL>,其中包含一个方法

Class<MODEL> getModelType();

我需要有一个扩展Converter&lt;String, Id&lt;SOMETYPE&gt;&gt;的实现,所以为了满足编译器,我需要实现以下方法:

@Override
public Class<Id<SOMETYPE>> getModelType() {
    return Id<SOMETYPE>.class;  // does not compile
}

这是我需要恢复使用原始类型并改为实现Converter&lt;String, Id&gt;(使用原始类型Id)的极端情况吗?

【问题讨论】:

    标签: java generics


    【解决方案1】:

    由于类型擦除,Id&lt;SOMETYPE&gt;.class 与Id.class 相同,只是不能返回前者或后者(编译错误)。所以你需要欺骗编译器,例如:

    @Override @SuppressWarnings("unchecked")
    Class<List<String>> getModelType() {
        return (Class<List<String>>)(Class<?>)List.class;
    }
    

    【讨论】:

      【解决方案2】:

      我最近也遇到了这个问题。这是帮助我的问题:

      Java casting ".class"-operator used on a generic type, e.g. List, to "Class<List<?>>" and to "Class<List<Integer>>"

      你的解决方案是这样的:

      public interface Converter<PRESENTATION, MODEL>  {
          Class<MODEL> getModelType();
      }
      
      interface Id<E>  {
      }
      
      class MyConverter<E> implements Converter<String, Id<E>>  {
          @Override
          public Class<Id<E>> getModelType() {
      
              @SuppressWarnings("unchecked")  //We know this is okay
              Class<Id<E>> cls = (Class<Id<E>>)(Class)Id.class;
               return  cls;
          }
      }
      

      【讨论】:

      • +1 提到了一个类似的问题,我没有找到。
      猜你喜欢
      • 2011-05-16
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      • 2013-07-22
      相关资源
      最近更新 更多