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 进阶视频系列中关于泛型的一个小节。
一个视频