2017-04-18 2 views
0

Je lisais le concept d'effacement de type dans les génériques. En exécutant le morceau de code ci-dessous, j'ai été confus.Effacement de type dans la confusion des génériques

public class CollectionsWild { 
    void Test(Collection<?> t){ 
     System.out.println("Collection"); 
    } 

    void Test(List<Integer> t){ 
     System.out.println("List"); 
    } 


    public static void main(String[] args) { 
     CollectionsWild o = new CollectionsWild(); 
     o.Test(new ArrayList<String>()); 
    } 

} 

Selon le concept d'effacement de type "List<Integer> t" est converti en "Liste t" en bytecode. Alors, pourquoi appelle-t-on mon test de méthode qui a Collection comme paramètre. Il aurait dû appeler la méthode avec List comme paramètre

+0

Merci, mais le lien que vous avez donné n'est pas lié à ce que je demandais .. –

Répondre

2

Cela n'a rien à voir avec l'effacement. La résolution de surcharge est effectuée au moment de la compilation. Une seule surcharge correspond à ArrayList<String> et c'est celle qui est choisie. S'il y avait plus d'un match, le plus spécifique aurait été sélectionné.

Dans le cas d'une surcharge avec le même type d'effacement, la définition du type ne compile pas avant que la résolution de surcharge ne soit prise en compte.

2

La sélection de méthode est une opération de compilation. L'effacement de type se produit par la suite. Comme vous pouvez le voir dans JLS§15.12.2, paramètres type générique sont considérés:

décider si une méthode est applicable volonté, dans le cas des méthodes génériques (§8.4.4), nécessitent une analyse des arguments de type.