先上幾段代碼,看看區別
//接口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也完全可以,只是一種習慣寫法。
歡迎有疑問的同學留言