2011-08-11 4 views
2

J'ai une classe générique avec sous-classe.générique, générique, setter et getter dans Java

public class GenericClass<C> 
{ 
    private C value; 

    public C getValue() { return value; } 

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

Dans mon code, j'utiliser les sous-classes sans savoir ce que les sous-classes mais je sais que ces deux sous-classes sont même type:

GenericClass<?> obj1 = ... // has a value here 
GenericClass<?> obj2 = ... // has a value here 

// I know that obj1 is the same type of obj2 but I don't know this type. 
obj1.setValue(obj2.getValue()); 

La dernière ligne génère une erreur de compilation qui est:

la méthode setValue (capture # 11 de?) dans le type GenericClass est pas applicable pour les arguments (capture # 12 de?)

Comment puis-je faire (quelque chose comme jetant un joker ...)?

Répondre

3

Depuis GenericClass<?> ne contient aucune information du type ci-joint réel, le compilateur n'a aucun moyen de faire en sorte que deux de ces classes sont compatibles. Vous devez utiliser un paramètre de type générique nommé concret. Si vous ne connaissez pas le type concret, vous pouvez toujours appliquer la similitude des deux paramètres de type par exemple. renfermant le code ci-dessus dans une méthode générique:

public <T> void someMethod() { 
    GenericClass<T> obj1 = ... // has a value here 
    GenericClass<T> obj2 = ... // has a value here 

    obj1.setValue(obj2.getValue()); 
} 

Si cela est impossible, vous pouvez en dernier recours essayer moulages explicites, ou en utilisant des types bruts. Cela échangera l'erreur de compilation avec un ou plusieurs avertissements de cast non cochés.

+0

« Si cela est impossible » Même s'il est impossible, ils peuvent encore faire la méthode ci-dessus une méthode d'assistance privée et appellent de partout où ils besoin et il fonctionnera en raison de la capture capture – newacct

1

Vous devez taper votre méthode:

public static <T extends GenericClass<?>> void someMethod() { 
    T obj1 = ... // has a value here 
    T obj2 = ... // has a value here 

    // Now they are the same type 

    obj1.setValue(obj2.getValue()); 
} 

essayer. Faites-moi savoir si elle ne compile pas (et fournir le code)