我有一个需要处理扩展Number
类的对象的类。为此,我使用类型参数T
。但是,该类中的某些函数需要知道T
是什么类(例如,返回与T
相同类的对象)。
随处可见的解决方案Class<T> clazz = (Class<T>) ((ParameterizedType) getClass().getSuperClass()).getActualTypeArguments()[0];
看起来很有希望,因为我可以使用isAssignableFrom
。但是,getActualTypeArguments[0]
部分返回一个TypeVariableImpl
,这显然意味着我需要做一些不同的事情。
更具体地说,我当前拥有的代码如下:
public class Outer {
//Sole purpose of the Dummy class is for the getGenericSupertype() method.
private static abstract class Dummy<T> {
private Class<T> clazz;
@SuppressWarnings("unchecked")
public Dummy() {
clazz = (Class<T>) ((ParameterizedType)
getClass().getGenericSuperclass())
.getActualTypeArguments()[0]; //ClassCastException
}
public Class<T> getClazz() {
return clazz;
}
}
public static class Foo<T extends Number> extends Dummy<T> {
private Class<T> typeOfNumber;
//...
public Foo() {
typeOfNumber = getClazz();
//...
}
public Foo(T number) {
this();
//...
}
//...
private boolean isA(Class<?> type) {
return type.isAssignableFrom(typeOfNumber);
}
public T toThisType(double x) {
if(isA(Integer.class))
return new Integer((int) x);
//...
}
}
//Several functions that use Foo were omitted for brevity.
}
我打算在其他类中扩展Outer
,然后为某些操作创建Foo
对象。如果可能,我不想在任何构造函数中放入类似Class<T> clazz
的内容。简而言之,声明为new Foo<Integer>()
的对象是否可以知道T
是Integer
?