2013-07-30 3 views
1

Предположим, у меня есть:время выполнения Родовой тип Java

ClassA extends SuperClass{ ...} 
ClassB extends SuperClass{ ... } 

также ClassX<T extends SuperClass> { ... }

Теперь, во время выполнения я наткнулся на объект, который я знаю, должен быть один из ClassA или ClassB. И я хочу создать экземпляр ClassX на основе этого. Как я могу это сделать?

Я попытался:

Class<?> className = object.getClass(); 
Class<className> objectx = ... 

, который не работает.

Заранее благодарен!

+1

Все типичные типы будут заменены Объектом во время созидания. Вот почему вы не можете выбрать общий тип во время выполнения. – pad

ответ

0

ClassX<SuperClass> myObj = new ClassX<SuperClass>();

С родовым классом вы просто говорите, что вы можете иметь значение в том классе, который является то, что общий тип

ClassX<T extends SuperClass>{ 
    public T value; // its just public so i dont need a setter 
} 

Теперь вы можете сделать: theObjectThatIsAOrB = xy.get () // теперь вы получаете свой объект, который является ClassA или ClassB

ClassX<SuperClass> myObj = new ClassX<SuperClass>(); 
myOjb.value = theObjectThatIsAOrB; 
0

Это невозможно, поскольку это не имеет смысла. Подумайте об этом, если бы вы могли это сделать, что бы это было хорошего? Единственной целью параметра типа является проверка типа во время компиляции. Поэтому, если у вас есть параметр типа, который вы не знаете во время компиляции, он не может ввести проверку, и он ничего не может сделать; поэтому нет смысла иметь параметр типа в первую очередь. (Использование подстановочного знака ничем не отличается.)

0

Если компилятор может определить, какой из A или B задействован, просто используйте новый.

public <T extends SuperClass> ClassX <T> makeClassXInstance(T aOrB) { 
    return new ClassX<T>(); 
} 

Если, с другой стороны, вы хотите определить класс во время выполнения, что-то вроде этого может работать. Но вы сталкиваетесь с проблемой типа варианта. Java отстой для решения проблемы.

public <T extends SuperClass> ClassX <T> makeClassXInstance(T aOrB) { 
    return new ClassX<T>(aOrB.getClass()); 
} 

public class ClassX<T>{ 
    public ClassX(Class<T> cls) {...} 
} 
Смежные вопросы