本文原創首發CSDN,本文鏈接https://blog.csdn.net/qq_41464123/article/details/107604827 ,作者博客https://blog.csdn.net/qq_41464123 ,轉載請帶上本鏈接,謝謝配合。
目錄
零、最直觀的理解——泛型是什么
泛型 ,顧名思義就是 廣泛的數據類型,也就是說什么數據類型都可以。
一般來說,我們見到的泛型就是這個樣子,用 T 表示。
如下所示,在類名后方申明泛型 T,接着就可以在成員變量、方法中使用泛型了。
public class User<T> {
private T name;
}
對於這個name變量,我們可以放入不同數據類型的值,比如字符串String,比如整數int......
下面測試類創建了三個User對象,第一個對象的name屬性放入了String字符串,第二個放入了int整數,第三個放入了Double浮點數。
//泛型測試方法
public static void main(String[] args) {
User user1 = new User();
user1.setName("zwz");
System.out.println(user1.getName() instanceof String);
User user2 = new User();
user2.setName(123456);
System.out.println(user2.getName() instanceof Integer);
User user3 = new User();
user3.setName(123.456);
System.out.println(user3.getName() instanceof Double);
}
我們發現,不管放入什么數據類型,我們都可以正常運行,運行結果如下圖所示
像上面這樣,我們就可以理解為泛型的一種應用。
即如果數據類型不確定,可以使用泛型方法的方式,達到簡化代碼、提高代碼重用性的目的。
泛型的本質是參數化類型,也就是說所操作的數據類型被指定為一個參數,使代碼可以應用於多種數據類型。
以上就是我對泛型比較直觀的理解,如果你想了解更多,請繼續閱讀下面內容。
內容比較枯燥,但還是很有用的。
一、舉個栗子——從ArrayList說起
List<String> list = new ArrayList<String>();
這行代碼,相信很多小伙伴都經常使用。在Java中,雖然后原生的數組String[],但是String[]功能並不能滿足我們的需要,更多的任會選擇使用Java的集合類——List。
List有兩大實現,那就是是 ArrayList 和 LinkedList,分別代表順序表和鏈表這兩個數據結構。
雖然順序表和鏈表各有各的好處,但是對於新手來說,總喜歡使用ArrayList ,相信這也是大家有目共睹的。
細心地小伙伴應該發現過,在Eclipse中,我們按下Ctrl鍵 + 鼠標左鍵,就可以進入某個類或者方法的具體實現。
就像這樣,我們可以打開List的底層代碼。
public interface List<E> extends Collection<E> {
/**
* Appends the specified element to the end of this list (optional
* operation).
*
* <p>Lists that support this operation may place limitations on what
* elements may be added to this list. In particular, some
* lists will refuse to add null elements, and others will impose
* restrictions on the type of elements that may be added. List
* classes should clearly specify in their documentation any restrictions
* on what elements may be added.
*
* @param e element to be appended to this list
* @return {@code true} (as specified by {@link Collection#add})
* @throws UnsupportedOperationException if the {@code add} operation
* is not supported by this list
* @throws ClassCastException if the class of the specified element
* prevents it from being added to this list
* @throws NullPointerException if the specified element is null and this
* list does not permit null elements
* @throws IllegalArgumentException if some property of this element
* prevents it from being added to this list
*/
boolean add(E e);
// 其余方法省略
}
在第一行類的定義代碼中,就使用到了泛型。
public interface List<E> extends Collection<E>
也就是說,在我們平時使用List的時候,可以初始化為String類型的List
List<String> list = new ArrayList<String>();
也可以初始化為 Integer(int)的List
List<Integer> list = new ArrayList<Integer>();
當你的List 為String類型,在調用add()方法時,IDE會提示你是String類型的參數
同理,當List為Integer類型,調用add()方法,
在JDK1.5之前,List的add()方法的參數是Object類型,不管把什么對象放入List中,都會被強制轉換為Object類型。
在通過get()方法取出集合元素時,必須進行強制類型轉換,這樣不僅繁瑣,也容易出現強制轉換異常。
從JDK1.5開始,引入了泛型這樣一個新概念,改寫了集合框架中的所有接口和類,增加了泛型的支持。
使用泛型集合在創建集合對象的時候,制定了集合中的元素類型,從集合中取出元素時,無需強制類型轉換,並且在集合中放入非指定類型的對象,IDE將出現編譯錯誤。
比如下圖在String類型的集合中插入Double類型的浮點數:
使用泛型集合在創建集合對象時置頂集合中的元素類型,從集合中取出元素時無需進行強制類型轉換。
本文原創首發CSDN,本文鏈接https://blog.csdn.net/qq_41464123/article/details/107604827 ,作者博客https://blog.csdn.net/qq_41464123 ,轉載請帶上本鏈接,謝謝配合。
二、更多應用——泛型用法遠不止這些
在集合中使用泛型只是多種應用中的一種,在接口、類、方法等方面也有着泛型的廣泛應用。
2.1 泛型類
對於一些常常處理不同類型數據轉換的類,我們可以使用泛型來定義。比如一個人的身高,可以認為是整數,也可以是浮點數。
public class User<T> {
private T height;
public User(T height) {
this.height = height;
}
public void say() {
System.out.println("I am " + this.height + "cm(s) tall.");
}
public T getHeight() {
return height;
}
public void setHeight(T height) {
this.height = height;
}
}
我們在測試方法中傳入不同數據類型,都可以say()方法
public class Main {
public static void main(String[] args) {
User user1 = new User(180);
user1.say();
User user2 = new User(188.5);
user2.say();
}
}
2.2 泛型接口
interface SayHeight<T>{
public T getHeight();
};
泛型接口同理,就是擁有一個或者多個類型參數的接口,泛型接口接口的定義方式和定義泛型類比較類似。
public class User<T> implements SayHeight{
private T height;
public T getHeight() {
return height;
}
public void setHeight(T height) {
this.height = height;
}
}
即getHeight()返回的類型由外部決定。
public class Main {
public static void main(String[] args) {
User<String> user = new User();
user.setHeight("188.8");
System.out.println(user.getHeight());
}
}
2.3泛型方法
有一些方法常常需要對某個類型數據進行處理,但是處理的數據類型不唯一,就可以通過定義泛型方法,簡化代碼,以提高代碼利用率。
public class Main {
public <String> void showType(String s) {
System.out.println(s.getClass().getName());
}
public static void main(String[] args) {
Main main = new Main();
main.showType(123);
main.showType(123.456);
main.showType(123.456f);
main.showType(123l);
main.showType("hello zwz");
}
}
雖然在方法中寫了String,但是可以傳入多種數據類型的參數,進行不同的操作。