2013-03-19 9 views
0

J'ai une méthode qui pourrait retourner de classe A ou B. Comment puis-je définir son type de retour d'être générique, indépendamment de quel type de classe est retourné. Par exempletype de classe générique

public <Generic_Class_Return_Type> showForm() { 
    if (true) 
     return new ClassA(); 
    else 
     return new ClassB(); 
} 
+1

Ajoutez la même interface aux classes, renvoyez l'interface –

+0

L'une des méthodes consiste simplement à renvoyer un objet. Mais je voulais savoir s'il y a quelque chose de plus générique et approprié à utiliser public Object showForm() { if (true) return new ClassA(); sinon return new ClassB(); } –

Répondre

0

Vous pouvez utiliser une interface deux classes implémentent comme ceci:

public SomeInterface showForm() { 
    if (true) 
     return new ClassA(); 
    else 
     return new ClassB(); 
} 

class ClassA implements SomeInterface{} 
class ClassB implements SomeInterface{} 
+0

Merci. Mais je pensais qu'il y avait quelque chose dans Java Generics pour gérer cela? –

+0

Non, il n'y a pas de type de retour générique. Vous pouvez faire la classe contenant la méthode générique et rendre cette fonction retourne le type générique, mais vous néanmoins avoir soit une superclasse ou un bot d'interface ClassA et ClassB dérivent/mettre en œuvre – ITroubs

+0

S'il n'a pas été possible d'utiliser une variable de type comme type de retour, Liste .get (int) ne pouvait pas retourner un T et vous auriez à lancer tous les temps – Raffaele

0
public object showForm() 
{ 
    if (true) 
     return new ClassA(); 
    else 
     return new ClassB(); 
} 

ou

public superClassName showForm() 
{ 
    if (true) 
     return new ClassA(); 
    else 
     return new ClassB(); 
} 
0

La façon la plus simple est de les retourner comme un objet.

public Object showForm() { 
    if (true) 
     return new ClassA(); 
    else 
     return new ClassB(); 
} 

Ce n'est pas si utile cependant, une solution bien plus utile serait de les étendre, soit une classe commune ou mettre en œuvre une interface commune.

public CommonInterface showForm() { 
    if (true) 
     return new ClassA(); 
    else 
     return new ClassB(); 
} 

class ClassA implements CommonInterface { } 
class ClassB implements CommonInterface { } 
interface CommonInterface { } 

Ou

public CommonClass showForm() { 
    if (true) 
     return new ClassA(); 
    else 
     return new ClassB(); 
} 

class ClassA extends CommonClass { } 
class ClassB extends CommonClass { } 
class CommonClass { } 

Generics

Si vous voulez utiliser les médicaments génériques alors ClassA et ClassB devrait être la même classe, modifié par certains, par exemple de type générique. Class<T>. Que les génériques soient pertinents, tout dépend de la mise en œuvre de vos cours. Vous êtes probablement préférable d'utiliser une interface ou une classe de base.

1

Pas vraiment sûr si vous avez besoin des médicaments génériques dans ce cas, mais vous pouvez paramétrer soit toute la classe ou tout simplement la méthode et utiliser ensuite la réflexion comme ceci:

public <T> T getForm() { 
    Class<T> clazz = (Class<T>) ((true) ? Foo.class : Bar.class); 
    Constructor<T> ctor = clazz.getConstructor(); 
    return ctor.newInstance(); 
} 

Toutefois, si vous spécifiez votre cas d'utilisation, nous peut également suggérer si aller génériques est le chemin, ou si vous feriez mieux d'utiliser le polymorphisme standard.

+0

une petite faute de frappe: 'klass' vs' clazz' (Je voudrais que le monde adopterait 'theClass' ou' someClass 'comme une convention) – jahroy

+0

Merci, il y a beaucoup de fautes de frappe en fait. Premier message d'un téléphone (et vraiment je regrette!) BTW, il devrait y avoir au moins un casting décochée quelque part, pas sûr si elle compile du tout – Raffaele

+0

Été fait que ... l'affichage d'un téléphone est très difficile! Qui va créer l'application qui le rend plus facile ??!? – jahroy

Questions connexes