У меня есть класс, который должен обрабатывать объекты, которые расширяют класс 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
?