Java泛型中 ? 和 T 的區別

先上幾段代碼,看看區別

//接口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也完全可以,只是一種習慣寫法。

歡迎有疑問的同學留言

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章