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



是否在类构造函数中获取泛型类型以便将其传递给父构造函数?

给定基类:

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中是否有我不知道的功能/技巧,因为"t"在编译时是可用的。

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

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

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

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

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在BaseSupport类上获取ParameterizedType,而不需要向BaseSupport公共构造函数提供参数。

资源:

  • 反映泛型
  • StackOverflow的相关答案

相关内容

  • 没有找到相关文章

最新更新