2010-02-22 7 views
4

Dans la ligne suivanteétranges « modèle comme » syntaxe (génériques?)

Graph<Number,Number> ig = Graphs.<Number,Number>synchronizedDirectedGraph(
           new DirectedSparseMultigraph<Number,Number>()); 

pourrait vous s'il vous plaît expliquer ce que cela signifie? Graphs.<Number,Number>synchronizedDirectedGraph Cela ressemble à un appel à une méthode Graphs.synchronizedDirectedGraph, mais le truc ressemblant à un modèle après le point me laisse perplexe (au moins en raison de mon arrière-plan C++).

+0

Graphe ig -> Variable de type Graphe avec les ....... paramètres génériques ..... ..Graphiques. -> Appel d'une méthode statique de graphes ...... -> paramètres génériques de la méthode ..... synchronizedDirectedGraph -> nom de la méthode ...... nouveau DirectedSparseMultigraph () -> Nouvelle instance ........ deDirectedSparceMultigraph avec comme paramètres génériques jjj

+0

Source de réponse: http://www.developpez.net/forums/d704051/java/ general-java/probleme-ligne-code/ – jjj

+0

En C++, vous devez mettre les arguments du modèle après le nom de la fonction. Java distingue la syntaxe des types génériques et des méthodes génériques (elle utilise également des espaces de noms différents pour les types/champs et les méthodes). Notez que vous avez besoin du type en avant pour des raisons syntaxiques (sauf si les arguments génériques peuvent être impliqués quand vous pouvez rater le lot). –

Répondre

5

Le problème est que Java n'est pas très intelligent dans les endroits où il supporte l'inférence de type.

Pour une méthode:

class A{} 
class B extends A{} 
class Y{ 
    static <T> List<T> x(T t) 
} 

Il infère le type List<B> du type de paramètre B

List<B> bs = Y.x(new B()); 

Mais si vous avez besoin List<A> vous devez jeter B ou ajouter l'indication du compilateur:

List<A> as1 = Y.<A> x(new B()); 
List<A> as2 = Y.x((A) new B()); 

Une partie du problème est que les génériques de Java sont invariants, donc List<B> n'est pas un sous-type de List<A>.

6

Il spécifie les types pour la méthode statique. Voir Generic Types, Part 2 (en particulier la section "Génériques mehods") pour plus d'informations.

Questions connexes