2010-12-05 13 views
2

Je suis les définitions suivantes de la classe.Java Generics Question

public class Test2<T extends Test3> { 

    private T t ; 


    public T foo() { 
     Test3 test3 = new Test3(); 
     t = test3; // I get compilation error here.** 
     return t; 
    } 

} 

class Test3 { 

} 

J'obtiens l'erreur de compilation à la ligne t = test3, en disant « non-concordance de type ne peut pas convertir Test3 à T, Quel est le problème

+0

Une variable d'objet enfant peut-elle faire référence à un objet parent? –

+1

@Hovercraft: non, il ne peut pas, c'est précisément le problème (voir ma réponse) –

+1

Je sais que Mark, je voulais que le PO pour le comprendre, mais j'ai posté comme un commentaire plutôt que d'une réponse. :( –

Répondre

8

Ce que vous faites est équivalent à ceci:

?
Integer n = new Number(); 

et n'a rien à voir avec les génériques (notez que Integer extends Number). le compilateur indique que vous ne pouvez pas attribuer un type de parent à une instance d'un type d'enfant, le type de parent ne peut pas mettre en œuvre toutes les méthodes requises est le type d'enfant.

Dans ce cas, T est le type enfant de Test3 ou Test3 lui-même. Donc, ici, vous essayez d'assigner la classe parent (T) à une variable qui contient la classe enfant (Test3) et elle échoue, tout comme l'exemple ci-dessus.

2

T est une sous-classe de Test3. En tant que tel, à moins que ce soit exactement Test3 l'assignation échouera puisque les sous-classes peuvent être assignées aux variables d'un type de superclasse mais l'inverse n'est pas vrai.

0

Parce qu'il est baissé. T peut être une classe dérivée de Test3, si vous vous (mais pourquoi vous avez besoin T, utilisez toujours Test3) vous pouvez utiliser suivre la coulée explicite:

@SuppressWarnings("unchecked") 
t = (T)test3; 
+0

Je veux retourner l'instance de Test3.La méthode d'écriture sans Generics est seulement la solution ? – Neel

+0

sera-t-il moche si je lance comme suit: @SuppressWarnings ("non cochée") t = (T) test3; – Neel

1

une variable d'objet enfant peut se référer à un objet parent?

Juste tester sans les génériques:

public class Foo { 

    public static void main(String args[]) { 
     T t = new Test3(); 
    } 
} 

class T extends Test3 { 
} 

class Test3 { 
} 

modifier: Nevermind, j'ai d'abord posté un commentaire, puis posté comme une réponse ... mais était trop tard! :)