Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:参数化实现的内部类中不需要的类型擦除_Java_Types_Inner Classes_Type Erasure - Fatal编程技术网

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

Java:参数化实现的内部类中不需要的类型擦除,java,types,inner-classes,type-erasure,Java,Types,Inner Classes,Type Erasure,好的,我有一个参数化接口,它的实现有一个内部类。似乎我无论如何都不能引用内部类的完整(泛型)类型,因为它本身不是参数化的,只有隐式使用封闭类的类型参数: public interface TestA<R> { public Class<? extends R> getTheRClass(); } public class TestB<Z> implements TestA<TestB<Z>.InnerStuff> { p

好的,我有一个参数化接口,它的实现有一个内部类。似乎我无论如何都不能引用内部类的完整(泛型)类型,因为它本身不是参数化的,只有隐式使用封闭类的类型参数:

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();
   }
}
公共接口测试{

public Class由于擦除,您返回的实际
Class
实例在内部将只是
TestB.InnerStuff.Class
;运行时
部分实际上并不存在。因此,您使用
return TestB.InnerStuff.Class
的本能是出于金钱考虑的。要让它正常工作,您只需在说服编译器不要尖叫的原始类型
Class

return (Class)TestB.InnerStuff.class;
(然后,您可以添加一个注释,如
@SuppressWarnings({“unchecked”,“rawtypes”})
,告诉编译器您不需要此警告消息。)