У меня есть класс, который принимает токен типа, а затем генерирует объекты типа, параметризованного этим типом (хорошо, это немного сложнее, но это краткий пример):
public class Test {
public static void main(String[] args) throws Exception {
Holder<HashSet<Integer>> i = newObjectHolder(HashSet.class); // this fails
}
static class Holder<T> {
public Holder(T newInstance) {}
}
public static <T> Holder<T> newObjectHolder(Class<T> typeToken) throws Exception {
Constructor<T> ctor = typeToken.getConstructor();
return new Holder<T>(ctor.newInstance());
}
}
Это отлично работает, если переданные неуниверсальные типы, например:
Holder<Integer> i = Test.newObjectHolder(Integer.class);
Если переданный токен типа является универсальным, он не работает, как в указанной строке выше:
Holder<HashSet<Integer>> i = Test.newObjectHolder(HashSet.class); // this fails
Я понимаю проблему, но есть ли решение? Я могу добавить @SuppressWarnings ("unused") в код для newObject
, если это не снижает безопасность. Интуитивно кажется, что newObject должен иметь возможность создать работающее приведение, мы знаем, что один «новый» объект стертого универсального типа такой же, как и любой другой, и мы иначе не использовали T
в методе.