Je me gratte la tête sur comment fonctionne cet exemple et semble imprimer correctement.Comment compile une méthode avec un varargs de type Bounded Wildcard?
public class Test {
static class Shape {
public String toString() {
return "Shape";
}
}
static class Circle extends Shape {
public String toString() {
return "Circle";
}
}
static class Square extends Shape {
public String toString() {
return "Square";
}
}
public static void wildCardVarArgs(ThreadLocal<? extends Shape>... list) {
for (ThreadLocal<? extends Shape> s : list) {
System.out.println(s.get().toString());
}
}
public static void test() {
ThreadLocal<Shape> shape = new ThreadLocal<>();
shape.set(new Shape());
ThreadLocal<Square> square = new ThreadLocal<>();
square.set(new Square());
ThreadLocal<Circle> circle = new ThreadLocal<>();
circle.set(new Circle());
wildCardVarArgs(shape, square, circle);
}
}
des tests d'appel imprimeront:
"Shape"
"Square"
"Circle"
Intuitivement cela fait sens, comme la signature de méthode est décrite comme accepter toute somme d'arguments aussi longtemps qu'ils sont de type ThreadLocal avec un type de toute extension de forme. Donc passer dans un ThreadLocal<Square>
avec ThreadLocal<Circle>
correspond à la facture.
Mais comment cela compile-t-il de telle sorte que le runtime puisse déterminer la surcharge correcte de la chaîne? Ma compréhension brouillée de l'effacement de type générique donne l'impression que ce type de signature de méthode ne devrait pas être possible même de compiler. J'aurais pensé que la signature de wildCardVarArgs deviendrait quelque chose comme wildCardVarArgs(ThreadLocal[])
en octet, ce qui semble être une exécution de ClassCastException. Mais plus j'y pense, plus je deviens confus.
Quelqu'un peut-il donner un sens à cela et que fait la compilation à un type de ThreadLocal de type Bounded Wildcard?
effacement ou non, 's.get()' obtiendra un objet 'Square/Circle', et le' toString 'surchargé sera appelé. – ZhongYu
Si vous supprimez tous les génériques du code, il suffit d'utiliser des types bruts partout, vous pouvez voir pourquoi cela fonctionne très bien au moment de l'exécution. – ZhongYu