2017-03-05 4 views
3

je cet exemple de code montrant différentes signatures de méthode:méthode Java de compatibilité de signature

public class Main { 
    public static interface MyMap extends Map {} 
    public void func1(List<MyMap> m) {} 
    public void func2(List<Map> m) {} 
    public void func3(List<? extends Map> m) {} 
    public void func4(List<? extends Map<?, ?>> m) {} 
    public <M extends Map<?, ?>> void func5(List<M> m) {} 
    public static void main(String[] args) { 
     List<MyMap> myMap = null; 
     Main main = new Main(); 
     main.func1(myMap); // OK 
     main.func2(myMap); // not applicable 
     main.func3(myMap); // OK 
     main.func4(myMap); // not applicable 
     main.func5(myMap); // OK 
    } 
} 

Quand j'ai MyMap extension du type cru Map je ces confusions sur la compatibilité de la signature de la méthode en Java. Comme vu func1 est un test de contrôle, évidemment IDE ne se plaindra pas. En func2, je peux comprendre MyMap n'est pas exactement un Map, par conséquent IDE se plaint. Après la mise à jour de la signature comme func3 cela fonctionne à nouveau. En ce qui concerne func4, je pense en quelque sorte que Map<?,?> n'est pas la même chose qu'un type brut Map, c'est pourquoi IDE se plaint à nouveau? Mais alors, ce qui m'intrigue le plus, c'est func5 parce qu'il semble équivalent à func4 mais IDE ne s'en plaint pas?

Répondre

0

Je pense que cela a été déjà répondu:

Difference between Bounded Type parameter and Upper Bound Wildcard

exception Seulement, vous avez ajouté type Raw Eresure, mais je ne pense pas influencer le résultat en quelque sorte.

Aussi, je pense que vous trouverez peut-être utile suivante:

main.func4((List<? extends Map<?, ?>>) myMap); // OK, but unchecked warning