Создать анонимный внутренний класс Java с помощью универсального использования класса в переменной

Возможно ли в Java 7 создать экземпляр анонимного внутреннего класса с универсальным типом, используя объект Class, который у меня есть?

Вот упрощенная версия универсального класса, который я пытаюсь создать:

abstract class DomainBuilder<E> {

    private final Class<E> entityClass

    public DomainBuilder() {
        this.entityClass = (Class<E>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

    ...
}

Создание анонимного внутреннего класса, когда я указываю класс, который я хочу создать во время компиляции, отлично работает:

DomainBuilder builder = new DomainBuilder<MyDomainClass>() {}

Я хотел бы сделать так, чтобы я мог использовать переменную Class, которую я определил во время выполнения, как это, но еще не понял, как это сделать:

Class clazz = MyDomainClass.class
...
DomainBuilder builder = new DomainBuilder<clazz>() {}

Я также безуспешно пытался создать методы по этим направлениям:

Class clazz = MyDomainClass.class
DomainBuilder builder = builderFor(clazz)

public static DomainBuilder<T> builderFor(Class<T> t) {
    return new DomainBuilder<T>(entityManager){}
}

Возможно ли что-то подобное?


person Ted Naleid    schedule 24.11.2013    source источник


Ответы (2)


Вам придется создать совершенно отдельный конструктор, когда объект Class передается напрямую. Вы не можете вывести это снова так, как пытаетесь.

person Louis Wasserman    schedule 24.11.2013
comment
Итак, вы имеете в виду тот, где мой DomainBuilder принимает аргумент Class и просто устанавливает эту переменную напрямую? Это может сработать для моего варианта использования, спасибо за предложение. - person Ted Naleid; 25.11.2013

Я хотел бы иметь возможность сделать так, чтобы я мог использовать переменную класса, которую я определил во время выполнения, как это, но еще не понял, как это сделать:

 Class clazz = MyDomainClass.class ... DomainBuilder 
 builder = new  DomainBuilder<clazz>() {}

мы не можем на самом деле сделать это таким образом. Потому что при этом мы не определяем class Type по диагонали <>, а передаем объект claszz типа Class.

person Sage    schedule 24.11.2013