无论如何将构造函数中的泛型类型传递给父类构造函数?

时间:2014-10-02 20:04:08

标签: java generics reflection

无论如何在类构造函数中获取泛型类型以将其传递给父构造函数?

给定基类:

public class BaseSupport<T>{
   private Class<T> type;
   public BaseSupport(Class<T> type){
      this.type = type;
   }
}

无论如何都要创建一个子类来执行此操作吗?

public class Support<T> extends BaseSupport<T> {
    public Support() {
       // is there anyway to know what "T" is here?
       super( T.class );
    }
}

最后,我只能创建一个类:

public class MyClass extends Support<OtherClass>{
   // no need to explicitly define a constructor here since the Support class handles it
}

我知道Guava有TypeToken来帮助检索泛型类型信息,但鉴于super()必须是构造函数中调用的第一个方法,我不能用它来提取类型要传递给父类的信息。

我怀疑这是不可行的,但我想我会问是否有任何我在Java 7中不知道的功能/技巧,因为&#39; T&#39;将在编译时提供。

2 个答案:

答案 0 :(得分:1)

你可以有效地做到这一点。

public class MyClass extends Support<OtherClass>{
   // no need to explicitly define a constructor here since the Support class handles it
   public MyClass() {
       super(OtherClass.class);
   }
}

在支持方面,有一个接受Class类型的构造函数,并按照上面的说法调用super关键字(一起消除T.class)。


更新:或者,您可以使用Reflection在ParameterizedType课程上获取BaseSupport,而无需向BaseSupport公共构造函数提供参数。

<强>资源:

答案 1 :(得分:1)

您是否看到了TypeToken文档中提到的选项?

  

使用(通常是匿名的)子类捕获泛型类型,并根据知道类型参数的上下文类来解析它。例如:

   abstract class IKnowMyType<T> {
     TypeToken<T> type = new TypeToken<T>(getClass()) {};
   }
   new IKnowMyType<String>() {}.type => String