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?