2010-09-10 4 views
3

Je voudrais qu'une variante de ce code soit compilée en Java.type de résultat de liste prioritaire dans java

class X 
{ 
    List<X> getvalue(){...}; 
} 

class Y extends X 
{ 
    List<Y> getvalue(){...}; 
} 

Javac (1.6) renvoie une erreur parce que la liste <Y> et Liste <X> ne sont pas compatibles.

Le point est que je voudrais que le compilateur de reconnaître que la liste <Y> est un type de retour compatible Liste <X> si Y est un sous-type de X. La raison pour laquelle je veux ceci est de simplifier la utilisation d'une classe de fabrique définie par l'utilisateur. Remarque: Cette question est un peu comme this question mais pour java.

+1

Veuillez formater le code pour qu'il soit lisible. – Carlos

+0

Lire http://stackoverflow.com/questions/2754756/how-to-cast-a-list-of-inheriting-objects-to-a-collection-of-objects-in-java/2755050 et peut-être http://stackoverflow.com/questions/2776975/how-can-i-add-to-list-extends-number-data-structures/2777297 –

+0

Correction pour lui :) Juste m'a pris quatre essais ... lol. – Skurmedel

Répondre

6

Non, ce n'est pas un type compatible. Vous ne pouvez pas convertir de List<Y> à List<X> simplement parce que Y est une sous-classe de X. Considérez:

List<Banana> bananas = new ArrayList<Banana>(); 
List<Fruit> fruit = bananas; 
fruit.add(new Apple()); 
Banana banana = fruit.get(0); // But it's an apple! 

Vous pouvez utiliser des caractères génériques bornées en Java pour exprimer la variance limitée, ce qui donne quelque chose qui est valide:

List<? extends Fruit> fruit = bananas; 

parce que cela va vous empêcher (à la compilation) d'essayer de ajouter des fruits supplémentaires - le compilateur sait qu'il pourrait être invalide.

Je recommanderais Angelica Langer Java Generics FAQ pour plus de lecture sur ce genre de chose.

+0

http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf est recommandé pour tous ceux qui ont besoin de comprendre le fonctionnement des génériques Java. – Carlos

+0

Merci, c'est un bon pointeur. –

+0

La phrase "Vous pouvez utiliser la variance en Java ..." ne semble pas correcte (si vous considérez la définition de la variance). Peut-être que vous devriez dire "Vous pouvez utiliser des caractères génériques délimités en Java ..." à la place. Vous pouvez également ajouter que les caractères génériques délimités vous permettent de spécifier les contraintes de covariance/contravariance sur un paramètre de type sur le site d'utilisation. –

7

En Java, le type de retour de la méthode de remplacement doit être covariant avec celui de la méthode en cours de substitution.

La classe java.util.List n'est pas covariante (En fait, aucune classe Java n'est présente, ce qui est dû au manque d'annotations de variance de site de déclaration). En d'autres termes, B <: A n'implique pas List<B> <: List<A> (lire <: comme is-subtype-of). Votre code ne correspond donc pas à votre code.


En Java, vous avez une variance de site de définition. Voici donc les types de code:

import java.util.List; 

class X { 
    List<? extends X> getvalue() { return null; } 
} 

class Y extends X { 
    List<Y> getvalue() { return null; } 
} 
Questions connexes