Построение объектов с помощью отражения с использованием класса объекта - PullRequest
1 голос
/ 06 февраля 2012

Предполагая код, подобный приведенному ниже:

public interface Component<T>
{
}
public class ConcreteComponent<T> implements Component<T>
{
}

Как бы вы решили такую ​​проблему компиляции:

@Override
public Class<? extends Component<?>> getComponentClass() {
    // Does not compile!
    return ConcreteComponent.class;
}

В принципе, как вы можете видеть, я хотел бы иметь возможность конструировать объект с помощьюотражение с использованием класса компонента.Опуская детали, объявление метода может выглядеть так:

public <T extends Component<?>> void createComponent(Class<? extends T> clazz)
{
}

И наконец:

ConcreteComponent<Integer> cmp = createComponent(getComponentClass());

Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

0 голосов
/ 06 февраля 2012

Return (Class>) ConcreteComponent.class;

0 голосов
/ 06 февраля 2012

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

public class ConcreteComponent<T> implements Component<T> {
    public Class<? extends Component<?>> getComponent() {     // Does not compile!     
        return (Class<? extends Component<?>>) ConcreteComponent.class;
    } 
}

ИЛИ

public class ConcreteComponent<T> implements Component<T> {
    public Class<? extends Component<?>> getComponent() {     
        return (Class<? extends Component<?>>) this.getClass();
    } 
}
0 голосов
/ 06 февраля 2012

Это компилируется:

public Class<? extends Component> getComponent() {
    // Compiles!
    return ConcreteComponent.class;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...