Java学习之路(七):泛型
泛型的概述和基本使用
作用:把類型明確的工作推前到創(chuàng)建對象或者調(diào)用方法的時候
泛型是一種參數(shù)化類型,把類型當(dāng)做參數(shù)一樣傳遞來明確集合的元素類型
泛型的好處
- 提高安全性
- 省去強(qiáng)轉(zhuǎn)的麻煩
泛型的基本使用
- 聲明集合泛型的格式:List<String> li = new ArrayList<String>();
- <>中存放的必須是引用數(shù)據(jù)類型
泛型的注意事項(xiàng)
- 默認(rèn)聲明一個泛型集合,前后的類型要一致
- jdk1.7以上的新特性:在聲明泛型類型的時候可以只聲明前面的泛型(菱形泛型)
-
集合聲明泛型:代表此類或者子類都可以成為集合的元素
- 聲明的泛型類型一定要是引用類型
泛型ArrayList的遍歷
package lesson03;import java.util.ArrayList; import java.util.Iterator; import java.util.List;public class Demo01 {public static void main(String[] args){List<String> li = new ArrayList<String>();li.add("A");li.add("B");li.add("C");Iterator<String> iterator = li.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}}} 第一種:String package lesson03;import java.util.ArrayList; import java.util.Iterator; import java.util.List;public class Demo01 {public static void main(String[] args){List<Student> li = new ArrayList<Student>();li.add(new Student(11,"null11"));li.add(new Student(22,"null22"));li.add(new Student(33,"null33"));li.add(new Student(44,"null44"));for(Student fo:li){System.out.println(fo);}}}class Student{int age;String name;public Student(int age, String name) {super();this.age = age;this.name = name;}public Student() {super();// TODO Auto-generated constructor stub }@Overridepublic String toString() {return "Student [age=" + age + ", name=" + name + "]";} } 第二種:Object?
泛型類
定義格式:
public class 類名<泛型類型1,...>? ? ? ? ? 注意:這里可以有多個,但不建議
我們一般寫成? public class 類名<T>
注意事項(xiàng):
- 泛型類型必須是引用類型
- T的值是在創(chuàng)建對象的時候出現(xiàn)的
泛型方法
定義格式:
public 返回類型 方法名(泛型類型 變量名)
注意:對象方法的泛型參數(shù)要與類中的泛型一致,不可以使用其他的名字
順便補(bǔ)充:
泛型方法的定義:
public 返回類型(T) 方法名(泛型類型T 變量名)
具體的例子:
class Student<T>{ //泛型類private T o; //泛型屬性public T getO() {return o;}public void setO(T o) {this.o = o;}public void fun1(T f1){} //泛型方法,無參數(shù)public T fun2(int val){ //泛型方法,有參數(shù)return null;} }?
泛型接口
其實(shí)也就是:
public interface 接口名<數(shù)據(jù)類型>
使用場景:Dao (數(shù)據(jù)訪問層)
泛型的高級使用(通配符)
- <?>? ?表示任意類型,如果沒有明確表示,那么就是Object以及任何java類
- 一般是在傳入?yún)?shù)的時候用的,表示接受任何類型
- ? extends E? ?向下限定,E以及其子類
- addAll方法,如果T是一個父類,那么添加的列表可以是子類,但是被添加的類表不能是子類
- ? super E? 向上限定,E以及其父類
增強(qiáng)for循環(huán)
簡化數(shù)組和Collection集合的遍歷
格式:
for(元素?cái)?shù)據(jù)類型? 變量:數(shù)組或者Collection集合){
使用變量即可,這個變量就是數(shù)組或者Collection集合中的元素
}
其實(shí)在之前的ArrayList遍歷中使用的便是增強(qiáng)for循環(huán)
注意:增強(qiáng)for循環(huán)不能邊遍歷,邊刪除元素,增強(qiáng)for循環(huán)的內(nèi)部還是調(diào)用了
?
可變參數(shù)
定義方法的時候不知道我們該定義多少個參數(shù)。
格式:
修飾符? 返回值類型? 方法名(數(shù)據(jù)類型...變量名){}
注意事項(xiàng):
- 這里的變量在內(nèi)部就封裝成了一個數(shù)組
- 如果一個方法有可變參數(shù),并且有多個參數(shù),可變參數(shù)要放在最后面
補(bǔ)充:
Arrays工具類的asList()方法的使用
List<String> li = Arrays.asList("A","B","C"); System.out.println(li);?
在Arrays工具類的asList方法中就是使用了可變參數(shù)
Collection中的toArray(T[] a)將泛型轉(zhuǎn)化為數(shù)組
package lesson05;import java.util.ArrayList; import java.util.List;public class Demo01 {public static void main(String[] args) {List<String> li = new ArrayList<String>();li.add("A");li.add("B");li.add("C");String[] arr = new String[3];li.toArray(arr);for(String fo:arr){System.out.println(fo);}}}?
接下類是一個小例子
package lesson06; //一個例子 //學(xué)生類 //班級集合 //學(xué)校集合import java.util.ArrayList; import java.util.List;public class Demo1 {public static void main(String[] args) {List<Student> class_li = new ArrayList<Student>();class_li.add(new Student(1,"null1"));class_li.add(new Student(2,"null2"));class_li.add(new Student(3,"null3"));class_li.add(new Student(4,"null4"));List<List<Student>> school_list = new ArrayList<List<Student>>();school_list.add(class_li);for(List<Student> class_item:school_list){for(Student stu_item:class_item){System.out.println(stu_item);}}} } class Student{int age;String name;public Student() {super();}public Student(int age, String name) {super();this.age = age;this.name = name;}@Overridepublic String toString() {return "Student [age=" + age + ", name=" + name + "]";}} List嵌套List?
轉(zhuǎn)載于:https://www.cnblogs.com/smiling-crying/p/9363597.html
總結(jié)
以上是生活随笔為你收集整理的Java学习之路(七):泛型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Xamarin.Android 使用 S
- 下一篇: HTTP请求格式和HTTP响应格式