Java中常見到以下定義的類
public class Node<T> {
T data;
public Node<T> next;
Node(T data) {
this.data = data;
this.next = null;
}
}
這里的Node<T>是什么意思?
解釋
T是自定義泛型,泛型的主要目的是實現 java的類型安全,消除了強制類型轉換
使用上面的類定義如下
Node tmp1 = new Node(data);
Node<Integer> tmp2 = new Node<Integer>(data);
前者會有編譯的警告,即便它能夠執行;但是后者是沒有警告的,同時限定了data 是Integer類型的
這種定義方式的類,比如List,
public interface List<E> extends Collection<E>
現在版本的jdk可以少寫一個類型
List<String> dtr = new ArrayList<>();
PS:還有個好處,就是如果想要定義class Node<String> 和 class Node<Integer> 兩個類,那么使用泛型的話,只要定義一個類Node<T> 就好了
<T> T和T的區別?
以下參考:https://segmentfault.com/q/1010000009171736
問題

為什么會報錯?first不就是T類型嗎?還有<T> T和T有什么區別?
回答
如果你希望 getMax 方法的返回值類型為 T,就要這樣去定義getMax方法:
public T getMax()
如果你希望 getMax 方法返回值的類型由調用者決定,那么就這么去定義 getMax 方法:
public <A> A getMax() {
//...
return (A)result;
}
這里的 A ,一定不能與類名聲明的 T 是同個字母。
簡而言之,你說的 T 和 <T> T 根本是兩種不同的用途。
?通配符泛型
以下參考:https://www.cnblogs.com/Vcanccc/p/5701351.html
?和T都表示不確定的類型,但如果是T的話,函數里面可以對T進行操作
泛型三種:
[1]ArrayList<T> al=new ArrayList<T>();指定集合元素只能是T類型
[2]ArrayList<?> al=new ArrayList<?>();集合元素可以是任意類型,這種沒有意義,一般是方法中,只是為了說明用法
[3]ArrayList<? extends E> al=new ArrayList<? extends E>();
泛型的限定:
? extends E:接收E類型或者E的子類型。
?super E:接收E類型或者E的父類型。
原創文章,歡迎轉載,轉載請注明出處!
