2010-08-23 3 views
2

J'ai quelques procédures qui, par souci de simplicité, ressemblent à ce qui suit:Java: Une fonction avec plusieurs types de retour ... Est-ce possible avec des génériques?

public String fetchValueAsString(String key); 
public DateTime fetchValueAsDateTime(String key); 

Je veux quelque chose comme

public <X is a String or a DateTime> X fetchValue(String key); // pseudo-code 

que je pourrais appeler comme ça (sans coulée, le type est sous-entendu par les paramètres passés):

String str = fetchValue("subject"); 
DateTime dt = fetchValue("startDate"); 

Je sais que je pouvais avoir une méthode qui retourne le type d'objet et faire juste une conversion de coulée, bu t Je me demande s'il y a un moyen d'appeler une seule méthode et d'utiliser des génériques pour déterminer la valeur de retour. Donc, est-ce possible en Java (it is in C#)?

+0

Je pense que 'getString' et' getDateTime' pourraient être une bien meilleure idée. –

+1

Je pense que vous avez raison; Je suis [Greenspunning] (http://en.wikipedia.org/wiki/Greenspun%27s_Tenth_Rule). – Generics

Répondre

4

Bien sûr, mais cela ne fonctionnera que si le type de données est impliqué par le paramètre passé.

je peux déclarer ce qui suit et obtenir aucune erreur:

public static <T> T parseString(String s) { 
    return (T) new Date(); 
} 

public static void test() { 
    Date dt = parseString("date"); 
} 

Mais le résultat de ce genre de chose est à l'intérieur de votre fonction d'analyse syntaxique va devoir être en mesure de regarder la chaîne et de déterminer le type de cible et il va devoir faire beaucoup de casting à l'intérieur de son corps pour fonctionner correctement. Votre question laisse quelque peu d'ambiguïté si c'est le genre de chose que vous voulez, ou si ce que vous voulez vraiment, c'est que le type de récepteur détermine la méthode appelée ou le comportement à l'intérieur de la méthode. C'est, AFAIK pas possible. Une fois que vous êtes dans la méthode, tout ce que vous avez à faire est la chaîne.

+0

Mais c'est bien sûr "dangereux". –

+0

Il n'a pas demandé si c'était sûr. – Jherico

+0

Je n'ai pas demandé si c'était sûr. – Generics

1

En raison de l'effacement de type, en Java le type de retour devrait être adoptée en explicitement:

public <X> X fetchValue(Class<X> type, String key); 

Si vous connaissez la valeur va être du type correct, peu importe ce que, vous ne avoir à passer dans la classe <X>, et vous pouvez simplement faire un cast à (X) dans l'implémentation. Cependant, vous obtiendrez un avertissement du compilateur. Avec la classe <X> passé vous pouvez faire type.cast (valeur) en toute sécurité, et surtout faire une tentative de le convertir au type correct si n'est pas déjà de ce type.

+0

Uniquement si le type n'est pas implicite dans la clé – Jherico

+0

La clé n'est-elle pas une chaîne? –

+0

C'est une chaîne qui encode probablement certaines informations, qui peuvent être simplement des données, mais peuvent inclure un type. Considérez "date: 2010-03-01" vs "2010-03-01" – Jherico

Questions connexes