Java:参数实现的内部类中的不需要的类型擦除

时间:2012-11-26 20:00:03

标签: java types inner-classes type-erasure

好的,所以我有一个参数接口,其实现有一个内部类。似乎我不能以任何方式引用内部类的完整(泛型)类型,因为它本身不是参数化的,只有implicity使用封闭类'type参数:

public interface TestA<R> {
   public Class<? extends R> getTheRClass();
}

public class TestB<Z> implements TestA<TestB<Z>.InnerStuff> {

   public class InnerStuff {
       List<R> iCantBeStatic;
   }

   InnerStuff myStuff;

   @Override
   public Class<? extends TestB<Z>.InnerStuff> getTheRClass() {
      // return InnerStuff.class;
      // return myStuff.getClass();
      // return TestB.InnerStuff.class;
      // return TestB<Z>.InnerStuff.class;
      throw new AngryProgrammerException();
   }
}

有没有办法返回有问题的类并让编译器识别正确的类型?是的,我知道有1,001种解决问题的方法(使内部类静态,重构因此没有内部类等等)我想知道是否有一个表达式在该覆盖中起作用,或者如果不存在这样的表达......

1 个答案:

答案 0 :(得分:2)

由于删除,您返回的实际Class实例内部只有TestB.InnerStuff.class; <Z>部分在运行时实际上不存在。所以你对return TestB.InnerStuff.class的直觉就是金钱。要使其工作,您需要做的就是向原始类型Class添加强制转换以说服编译器不要尖叫:

return (Class)TestB.InnerStuff.class;

(然后您可以添加类似@SuppressWarnings({ "unchecked", "rawtypes" })的注释,告诉编译器您不需要警告消息。)