Límites superiores e inferiores de comodines genéricos de Java
<?extiende T> englobamiento tapado
?Indica una clase desconocida y T es una clase específica. Durante el desarrollo, reemplace T con una clase específica según la situación real, lo que indica que el parámetro genérico instanciado es un tipo de clase T o una subclase del tipo de clase T.
Por ejemplo
fruta
public abstract class Fruit {
public abstract void eat();
}
manzanas
public class Apple extends Fruit{
@Override
public void eat() {
System.out.println("我是苹果,我被吃掉了");
}
}
plátanos
public class Banana extends Fruit{
@Override
public void eat() {
System.out.println("我是香蕉,我被吃掉了");
}
}
clase de personas
public class People {
public void eatFruit(Class<? extends Fruit> clazz) throws IllegalAccessException, InstantiationException {
Fruit fruit = clazz.newInstance();
fruit.eat();
}
}
clase de prueba
public class text {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
new People().eatFruit(Apple.class);//我是苹果,我被吃掉了
new People().eatFruit(Banana.class);//我是香蕉,我被吃掉了
}
}
Crea una clase naranja sin heredar de la clase fruta
public class Orange {
public void eat() {
System.out.println("我是橙子");
}
}
En este momento, el siguiente código compilará e informará un error, porque la clase naranja no hereda la clase fruta y no está dentro del alcance de Class<? extends Fruit>
public class text {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
new People().eatFruit(Orange.class);//编译报错
}
}
<?super T> comodín de límite inferior
?Indica una clase desconocida, T es una clase específica y T se reemplaza con una clase específica según la situación real durante el desarrollo, lo que indica que el parámetro genérico instanciado es el tipo de clase T o la clase principal del tipo de clase T.
Por ejemplo
public static void fun(List<? super Integer> list) {
fun(new ArrayList<Integer>());//ok
fun(new ArrayList<Number>());//ok
fun(new ArrayList<Object>());//ok
fun(new ArrayList<String>());//报错
}
La función fun requiere que se pase una Lista como parámetro, y el rango de tipo de Lista solo puede ser de tipo Integer, o la clase principal del tipo Integer, razón por la cual fun(new ArrayList()); informa un error, porque String no es la clase principal de Integer