Java的泛型是什么?為什么要用它?


 本文原創首發CSDN,本文鏈接https://blog.csdn.net/qq_41464123/article/details/107604827 ,作者博客https://blog.csdn.net/qq_41464123 ,轉載請帶上本鏈接,謝謝配合。


目錄

零、最直觀的理解——泛型是什么

一、舉個栗子——從ArrayList說起

二、更多應用——泛型用法遠不止這些

2.1 泛型類

2.2 泛型接口

 2.3泛型方法


零、最直觀的理解——泛型是什么

 

泛型 ,顧名思義就是 廣泛的數據類型,也就是說什么數據類型都可以

一般來說,我們見到的泛型就是這個樣子,用 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,但是可以傳入多種數據類型的參數,進行不同的操作。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM