2010-09-23 5 views
0

Quelle est la différence entre les signatures des deux méthodes ci-dessous?Différence entre: <T> ReturnContainer test() et: <T> ReturnContainer <T> test()?

public static <T> ReturnContainer test(Class<T> incomingClass) 
{ 
    List<TestTuple<T>> tupelo = new ArrayList<TestTuple<T>>(); 
    ReturnContainer rc = new ReturnContainer(tupelo, incomingClass); 
    return rc; 
} 

Quelle est la différence entre un type exigeant de retour <T> ReturnContainer ci-dessus par rapport <T> ReturnContainer<T> ci-dessous?

public static <T> ReturnContainer<T> test(Class<T> incomingClass) 
{ 
    List<TestTuple<T>> tupelo = new ArrayList<TestTuple<T>>(); 
    ReturnContainer rc = new ReturnContainer<T>(tupelo, incomingClass); 
    return rc; 
} 
+1

Vous avez demandé auparavant. Pourquoi ne rééditez-vous pas votre question précédente? Exact duplicate: http://stackoverflow.com/questions/3777315/t-cannot-be-resolved-to-a-type –

+1

ReturnContainer rc = new RetourContainer est-ce correct? Ne devrait-il pas être ReturnContainer rc = new ReturnContainer ? – tkr

Répondre

3

Eh bien, si ReturnContainer est une classe générique, que je suppose qu'il est de vos exemples, il est recommandé de ne pas utiliser les types premières comme dans le premier exemple, car il est de type pas sûr.

Par exemple, vous pourriez avoir quelque chose comme:

ReturnContainer<String> container = test(Integer.class); 

Cela fonctionnerait (mais produirait un avertissement) car le type de retour est un type brut. Ensuite, lorsque vous essayez d'obtenir quelque chose du conteneur, le compilateur croit qu'il s'agit d'une chaîne, mais c'est en fait un entier et vous obtiendrez une exception ClassCastException.

Edit: après avoir regardé votre question précédente

Vous devez nous dire si ReturnContainer a un paramètre de type en premier lieu, ou ce que le point de la classe est. Un paramètre <T> est utile sur les classes de conteneur telles que Listes ou Cartes, car il vous indique directement le type d'objets qu'il contient, par opposition à la gestion des objets et à leur envoi à n'importe quel élément lorsque vous les récupérez dans le conteneur. Ils offrent une sécurité de type supplémentaire. Vous savez avec certitude qu'un List<String> est garanti pour contenir uniquement des chaînes, et ses méthodes get et add ne font que renvoyer/accepter des chaînes. Si votre conteneur a un comportement similaire à celui d'un paramètre de type, vous devez utiliser la seconde méthode.

0

editted pour répondre à vos questions, et supprimé la version C# :)

En retournant un ReturnContainer, vous donnez des informations sur le type retourné des objets internes.

En ne faisant en informations sur la classe d'entrée, vous ne donnez pas d'informations sur l'ReturnContainer en tant que telle, ou les éléments à l'intérieur - juste que le paramètre est de type T.

+0

Oui, ils vont compiler, vous pouvez déclarer une méthode avec un paramètre de type générique. Votre version ne compile pas: 'Erreur de syntaxe sur le jeton" <"'. Je ne suis pas sûr de ce que vous essayez de faire, mais vous ne pouvez pas déclarer une méthode comme 'methodName ' en Java. –

+0

LOL. Lisez-le comme une question C#. Mon mauvais :) – tim

+0

J'ai enlevé mon petit moment de folie - l'explication de base se tient, mais il semble que vous avez couvert cela maintenant de toute façon. – tim

Questions connexes