2010-06-03 5 views
2

J'ai la classe suivante, j'ai besoin de taper dans le constructeur, comment puis-je faire cela?Obtenir le type à partir du nom de la classe avec les génériques Java

public abstract class MyClass<T> { 
    public MyClass() 
    { 
     // I need T type here ... 
    } 
} 

EDIT:

Voici exemple concret ce que je veux atteindre:

public abstract class Dao<T> { 
    public void save(GoogleAppEngineEntity entity) 
    { 
     // save entity to datastore here 
    } 

    public GoogleAppEngineEntity getEntityById(Long id) 
    { 
     // return entity of class T, how can I do that ?? 
    } 
} 

Ce que je veux faire est d'avoir cette classe étendue à tous les autres OTI, parce que d'autres OTI ont certaines requêtes qui sont spécifiques à ces daos et ne peuvent pas être générales, mais ces requêtes simples devraient être généralement disponibles pour toutes les interfaces/implémentations DAO ...

+0

Cela dépend de ce que vous voulez faire avec. Voulez-vous instancier un T? Voulez-vous appeler une autre fonction avec un T? – dplass

+0

J'ai dao que tous les autres daos étendent, donc ce dao étendu aura une opération de base qui peut être identique pour tous les daos, donc je dois connaître la classe où les objets résultants doivent être mappés – newbie

+0

Je ne suis pas sûr de comprendre, mais depuis vous avez T, vous pouvez le "mapper" dans les diverses autres méthodes de votre DAO, par exemple, T faireQuelque chose (T obj) – dplass

Répondre

4

Nous avons fait

public abstract BaseClass<T>{ 
protected Class<? extends T> clazz; 

    public BaseClass(Class<? extends T> theClass) 
    { 
     this.clazz = theClass; 
    } 
... 
} 

Et dans les sous-classes,

public class SubClass extends BaseClass<Foo>{ 
    public SubClass(){ 
     super(Foo.class); 
    } 
} 
7

Vous pouvez l'obtenir, dans une certaine mesure ... pas sûr si cela est utile:

import java.lang.reflect.ParameterizedType; 
import java.lang.reflect.Type; 

abstract class MyClass<T> { 
    public MyClass() {   
    Type genericSuperclass = this.getClass().getGenericSuperclass(); 
    if (genericSuperclass instanceof ParameterizedType) { 
     ParameterizedType pt = (ParameterizedType) genericSuperclass; 
     Type type = pt.getActualTypeArguments()[0]; 
     System.out.println(type); // prints class java.lang.String for FooClass 
    } 
    } 
} 

public class FooClass extends MyClass<String> { 
    public FooClass() { 
    super(); 
    } 
    public static void main(String[] args) { 
    new FooClass(); 
    } 
} 
+1

Notez que si vous avez fait 'new ConcreteMyClass ()', où 'public class ConcreteMyClass étend MyClass ' vous obtiendriez simplement "T", puisque le type n'est pas réifié . –

+0

Dao pourrait faire l'affaire. – dplass

0

Et vous ne pouvez pas simplement ajouter un paramètre constructeur?

public abstract class MyClass<T> { 
    public MyClass(Class<T> type) { 
    // do something with type? 
    } 
} 
0

Si je ne suis pas la lecture de ce mal, ne vous voulez juste

public <T> void save(T entity) 

et

public <T> T getEntityById(Long id) 

pour vos signatures de méthode?

Questions connexes