Class<String> 还是 Class< ? extends String>

Class 还是 Class< ? extends String>

引出问题

先上代码

点击查看代码
        Class<String> class01 = String.class;
        Class <? extends String> class02 = "hsp".getClass();

问题所在

为什么第一张图报错,第二张图却没有?

我的测试

上代码

点击查看代码
package com.pigplay;

/**
 * @Author:PigBrother
 * @Date:2022/9/25
 * @Description:ToDo
 */

public class Class_ {
    public static void main(String[] args) {
        // test
        Animal buru      = new Animal("哺乳动物");
        Pig    pig       = new Pig("小花猪");
        Dog    muyangDog = new Dog("牧羊犬");


        Class<? extends Animal> aClass = buru.getClass(); //一定要用 <? extends Animal>

        Class<Animal>           animalClass  = Animal.class; //可以用 <Animal>
        Class<? extends Animal> animalClass1 = Animal.class; // 也可以用<? extends Animal>

        Class<Pig>              pigClass1 = Pig.class; //可以用<Pig>
        Class<? extends Pig>    pigClass2 = Pig.class;// 也可以用 <? extends Pig>
        Class<? extends Animal> pigClass3 = Pig.class; //还可以用 <? extends Animal>


        pigClass1 = Dog.class; //报错 Required type: Class<Pig>  Provided:Class<Dog>
        pigClass2 = Dog.class; //报错 Required type: Class<? extends Pig>  Provided:Class<Dog>
        pigClass3 = Dog.class; // 不报错

    }
}


class Animal {
    private String name;

    public Animal() {
    }

    public Animal(String name) {
        this.name = name;
    }
}

class Pig extends Animal {
    public Pig() {
    }

    public Pig(String name) {
        super(name);
    }
}

class Dog extends Animal {
    public Dog() {
    }

    public Dog(String name) {
        super(name);
    }
}


结论

  • 通过 对象.getClass() 拿到的class 对象,要用 Class< ? extends xxx> 来接收,即要用泛型通配符和泛型的上界

  • 通过 类.class 拿到的class 对象,既可以用Class< ? extends xxx> ,也可以用 Class 来接收。

参考资料

关于 泛型通配符和泛型的上界 的讲解,下面这个视频讲得非常好! 这是B站的 一个java 进阶视频系列中关于泛型的一个小节。
一个视频

posted @ 2022-09-25 19:47  PigBrither666  阅读(88)  评论(0编辑  收藏  举报