2

好的,所以我有一个参数接口,它的实现有一个内部类。似乎我不能以任何方式引用内部类的完整(通用)类型,因为它本身没有参数化,并且仅隐式使用封闭类的类型参数:

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 种方法可以解决这个问题(使内部类静态、重构因此没有内部类等等)我想知道是否有一个表达式在该覆盖中有效,或者如果不存在这样的表达......

4

1 回答 1

2

由于擦除,Class您返回的实际实例将在内部只是TestB.InnerStuff.class; 该<Z>部分在运行时实际上并不存在。所以你的直觉return TestB.InnerStuff.class是钱。为了让它工作,你需要做的就是给原始类型添​​加一个强制转换Class来说服编译器不要尖叫:

return (Class)TestB.InnerStuff.class;

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

于 2012-11-26T20:07:29.207 回答