轉自:
http://www.java265.com/JavaCourse/202206/3752.html
泛型和Lambda一樣是很多初學者的難點,下文將通過示例的方式講述泛型的使用,如下所示
泛型簡介
泛型 從JDK5中就可以使用此語法糖 泛型的使用可在編譯階段約束操作的資料型別,并進行檢查 泛型的語法: 泛型的語法格式:<資料型別> 泛型注意事項: 1.泛型只能支持參考資料型別 2.集合的全部介面和實作類都是支持泛型使用
泛型的優點
1.可提前約定資料型別
2.并且在編譯階段就確定資料型別
可避免強制型別轉換的問題
例:泛型類的應用
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("柳絮");
list.add("劉達龍");
list.add("張靚穎");
for (String s : list) {
System.out.println(s);
}
}
自定義泛型類
我們將定義類同時指定一個泛型變數,這種類的定義模式
稱之為“泛型類”
泛型類的格式
修飾符 class 類名<泛型變數> { }
public class MyClassTest<E>{ }
例:自定義泛型類的示例
現創建一個泛型類,實作基本的增加、洗掉操作,以此來具體了解其用法:
//泛型類MyArrayLIst
public class MyClassTest<E> {
public void add(E e){
代碼省略
}
public void remove(E e){
代碼省略
}
}
//main
public static void main(String[] args) {
MyClassTest<String> list = new MyClassTest<>();
//通過對泛型的設定,實作對資料專一處理
list.add("劉暢");
list.add("艾米莉");
list.remove("葉問");
}
泛型類的原理
代碼編譯時,將泛型變數替換為真實的資料型別即可
自定義泛型方法
定義方法的同時指定泛型變數,我們將這種方法稱之為“泛型方法”
泛型方法的格式:
修飾符<泛型變數> 回傳值型別 方法名(形參串列){ }
public <E> void view(E e){ }
泛型方法的功能:
方法中可以使用泛型接收一切實際型別的引數,
方法更具備通用性,
泛型方法注意事項:
泛型方法需要區別于泛型類中所定義的方法
雖然它們也在使用泛型
但是該泛型不是其定義的,而是泛型類定義
例:泛型方法的定義
public static void main(String[] args) {
String [] name = {"柳蔭","毛成","李明浩"};
view(name);
Integer [] age = {18,16,20};
view(age);
}
//泛型方法的定義
public static <T> void view(T[] arr){
StringBuilder list = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
list.append(arr[i]).append("\t");
}
System.out.println(list);
}
自定義泛型介面
使用泛型定義的介面稱之為"泛型介面"
泛型介面的格式:
public interface User<E>{ }
public interface User <E>{ }
泛型介面的功能:
泛型介面可以讓實作類選擇當前功能需要操作的資料型別
例: 定義一個User介面
實作對老師Teacher類、學生Student兩個類的操作
//User介面
public interface User <E>{
void run(E e);
void ageAdd(E e);
}
//Student類
public class Teacher {
}
//實作類Fantype
public class Fantype implements User<Teacher> {
@Override
public void run(Teacher teacher) {
}
@Override
public void ageAdd(Teacher teacher) {
}
}
從以上代碼可以看出
User后定義的是泛型型別
并且用于到介面中的實際操作
通配符和上下限
通配符
?可以在“使用泛型”的時候代表一切型別 E T K V是在定義泛型的時候常用的字符,當然可以使用任意字符
上下限
上下限:
指我們傳入泛型型別的最大子類和最小型別
如:
上限:<? extends 父類> :傳入型別必須是該父類或者是父類的子類
下限:<? super 子類> :傳入型別必須是該子類或者是子類的父類
例:
public static void testFun(ArrayList<? extends User> User){
//通過上下限便可以將這個問題解決掉
//要求傳入的型別必須是User的子類才可以
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/492425.html
標籤:Java
