2010-07-21 4 views
1

Je reçois cette erreur avec le code suivant:L'exemple générique ne fonctionne pas? Alternatives ou suggestions?

The method getItemProperty(capture#2-of ? extends GenericTest.Item) in the type GenericTest.BaseContainer<capture#2-of ? extends GenericTest.Item> is not applicable for the arguments (GenericTest.Item)

import org.junit.Test; 

public class GenericTest { 

public class Item { 
    private String value; 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 
} 

public class WordItem extends Item { 

} 

public abstract class BaseContainer<T extends Item> { 
    public String getItemProperty(T item) { 
     return item.getValue(); 
    } 
} 

public class Document extends BaseContainer<WordItem> { 
} 

public static class ContainerFactory { 
    public static BaseContainer<? extends Item> getContainer(Item item) { 
    return new GenericTest().new Document(); 
    } 
} 

@Test 
public void theTest(){ 
    Item item = new WordItem(); 
    BaseContainer<? extends Item> container = ContainerFactory.getContainer(item); 
    String str = container.getItemProperty(item); //this line does not compile 
} 
} 

Je utilise Eclipse Helios avec jdk 1.6.0_16.

+2

Quelle est l'erreur que le compilateur vous donne? – KLee1

+0

s'il vous plaît ajouter plus d'informations à cette question. Ou il est en danger de se fermer. – jjnguy

+0

c'est l'erreur du compilateur La méthode getItemProperty (capture # 2-of? Extends GenericTest.Item) dans le type GenericTest.BaseContainer n'est pas applicable pour les arguments (GenericTest.Item) J'utilise Eclipse Helios avec jdk 1.6.0_16 – Alex

Répondre

1

Pour se débarrasser de l'erreur, changer votre code:

public static class ContainerFactory { 
    public static <T extends Item>BaseContainer<T> getContainer(Item item) { 
    return (BaseContainer<T>) new GenericTest().new Document(); 
    } 
} 

@Test 
public void theTest(){ 
    Item item = new WordItem(); 
    BaseContainer<Item> container = ContainerFactory.getContainer(item); 
    String str = container.getItemProperty(item); 
} 
+0

merci beaucoup ... qui a fonctionné – Alex

2

Je pense que le problème est que container est un BaseContainer<? extends Item>, à savoir qu'il est un conteneur de certains sous-type de Item. Cependant, le compilateur n'a aucun moyen de s'assurer que le sous-type en question est effectivement Item lui-même. Et en fait c'est WordItem, pas Item. Le problème global est que votre utilisation des paramètres génériques n'est pas cohérente et complète.

je pouvais faire votre code compiler avec ces modifications:

public class Document<T extends Item> extends BaseContainer<T> { 
} 

public static class ContainerFactory { 
    public static <T extends Item> BaseContainer<T> getContainer(T item) { 
    return new Test().new Document<T>(); 
    } 
} 

@Test 
public void theTest(){ 
    WordItem item = new WordItem(); 
    BaseContainer<WordItem> container = ContainerFactory.getContainer(item); 
    String str = container.getItemProperty(item); 
} 

Cela diffère de la suggestion de TrueSoft dans ce ici Document est également générique - ce ne peut pas être ce que vous voulez (vous avez donné aucune information concernant ce sujet) , mais au moins de cette façon, il n'y a pas de fonte dangereuse requise au sein de getContainer().

Questions connexes