Los límites superior e inferior de los comodines genéricos de Java

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

Supongo que te gusta

Origin blog.csdn.net/m0_48895748/article/details/126864007
Recomendado
Clasificación