我有一个静态工厂方法,签名如下:
public static <F, T extends Provider<F>> T getProvider(Class<T> clazz)
我正在尝试实现返回Class<T>
对象的方法,该对象是上面提到的getProvider
的参数。但是这样的定义不起作用:
public <F, T extends Provider<F>> Class<T> getProviderClass() {
return DefaultProvider.class;
}
你会建议什么?
答案 0 :(得分:0)
public Class<T> getProviderClass() {
Type superClass = getClass().getGenericSuperclass();
ParameterizedType type = (ParameterizedType) superClass;
Type[] types = type.getActualTypeArguments();
Class<T> providerClass = (Class<T>) types[0];
return providerClass;
}
您也可以将此代码放在构造函数中,将Class的实例变量设置为此方法提供的值,这样您就可以更轻松,更高效地访问它,以便在通用工厂中继续使用它
答案 1 :(得分:0)
你需要传入一个Class对象并用它做一些事情才能找到正确的DefaultProvider.class
您不能拥有通用工厂类。每种类型都需要在某处拥有自己的混凝土工厂。一个好的模式是让类通过静态方法提供它自己的默认工厂。
MyClass.getProvider()
您已定义MyClass和MyClassDefaultProvider并且getProvider返回MyClassDefaultProvider的实例