Java: общий типы в токене типа

У меня есть класс, который принимает токен типа, а затем генерирует объекты типа, параметризованного этим типом (хорошо, это немного сложнее, но это краткий пример):

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 в методе.

9
задан BeeOnRope 1 March 2012 в 19:55
поделиться