先上几段代码,看看区别
//接口1(没有实际意义)
public interface IToString {
String toLocalString();
}
//接口2,没有实际意义
public interface IPrint{
void printThis();
}
实现类
@Data
public class Person implements IPrint, IToString{
private int age;
private byte sex;
private double salary;
private String name;
@Override
public String toString() {
return "Person{" +
"age=" + age +
", sex=" + sex +
", salary=" + salary +
", name='" + name + '\'' +
'}';
}
@Override
public void printThis() {
System.out.println(this.toLocalString());
}
@Override
public String toLocalString() {
return this.toString();
}
}
功能类, 这个类可要看仔细了
public class Printer {
public static <T> void printThis(Class<T> obj) {
System.out.println(obj.getClass());
}
public static void printThis2(Class<?> obj) {
System.out.println(obj.getClass());
}
public static <T extends IPrint&IToString> void printThis3(Class<T> obj) {
System.out.println(obj.getClass());
}
public static <T extends IPrint&IToString> void printThis4(T object) {
object.printThis();
}
}
测试类
@Test
public void testT() {
Person p = new Person();
Printer.printThis(p.getClass());
Printer.printThis2(p.getClass());
Printer.printThis3(p.getClass());
Printer.printThis4(p);
}
首先, 接口和实现类没有实际意义, 仅用于测试泛型, 不做过多纠结
功能类有四个静态方法,printThis, printThis2, printThis3, printThis4
1. printThis和printThis2, 代码看上去不一样, 实际效果是一样的, 参数都是任意类类型(注意不是类对象)
2. printThis和printThis3,唯一的区别是泛型T做了限制,必须是实现了IPrint和IToString接口的类类型
3. printThis3和printThis4, 泛型T限定一样, 区别是前者是T类, 后者参数是T实例
没看懂的, 看下测试类就清楚了, 前面三个参数使用的都是, p的类类型, 最后一个使用的是类实例
总结: 参数要用实例是没办法用Class<?>的, Class<T> 使用场景是要使用限定类类型, 如果T类型不做限定,那么和Class<?> 没有区别。
补充:T这个字符没有任意意义, 换成A,B,C也完全可以,只是一种习惯写法。
欢迎有疑问的同学留言