一.泛型
1.泛型的簡介
泛型,是一種未知的資料型別,當不知道用什么資料型別時,就可以使用泛型,
2.泛型的種類
- E(Element) 在集合中使用,表示在集合中存放的元素
- T(Type) 表示Java類,包括基本類和自己定義的類
- K(Key) 表示鍵,比如Map中的key
- V(Value) 表示值
- N(Number) 表示數值型別
- ? 表示不確定的Java型別
3.注意點
例如:
public class ArrayList<E>{
public boolean add(E e){}
public E get(int index){}
}
1.創建集合物件時,就會確定泛型的資料型別,比如,我們在定義時輸入:
ArrayList<String> list=new ArrayList<String>();
String作為引數傳遞,把String賦值給泛型E
4.為什么我們使用泛型?
例如:
public class Generic {
public static void main(String[] args) {
show1();
}
private static void show1() {
ArrayList list = new ArrayList();//此時,默認為Object類
list.add("k");
list.add(1);
Iterator it = list.iterator();
for (Object o : list) {//增強for回圈,不報錯
System.out.println(o);
}
while (it.hasNext()) {//想使用String的方法length,拋出例外
Object obj = it.next();
String s = (String) obj;
System.out.println(s.length());
}
}
}

當我們想使用String類中的length方法時,發現例外:ClassCastException,因為我們現在不使用泛型時,默認傳入ArrayList的引數是Object類,String類是Object的子類,Object類不能使用子類獨有方法,
泛型優點如下:
- 將運行期例外(運行時報錯)提升到編譯期(寫代碼會報錯)
- 避免型別轉換的麻煩
5.泛型定義——類
/*
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
*/
public class GenericClass<E> {
private E name;
public E getName() {
return name;
}
public void setName(E name) {
this.name = name;
}
}
6.泛型定義——方法
/*修飾符 <泛型> 回傳值型別 方法名(引數串列(使用泛型)){
方法體
}
*/
public class GenericMethod {
public <M> void method01(M m){
System.out.println(m);
}
}
7.泛型定義——介面以及實作方式
public interface GenericInterface<I>{
public abstract void method(I i);
}
/*兩種定義方式:
1.定義介面的實作類,實作介面,指定介面泛型
public interface Iterator<E>{
E next();
}
Scanner類實作了Iterator介面,指定介面泛型為String
public final class Scanner implements Iterator<String>{
public String next(){}
}
*/
public class GenericInterfaceImpl1 implements GenericInterface<String> {
@Override
public void method(String s) {
}
}
/*
第二種方法:介面用什么泛型,實作類就用什么泛型,類跟介面走
public interface List<E>{
boolean add(E e);
E get(int index);
}
public class ArrayList<E> implements List<E>{
public boolean add(E e){}
public E get(int index){}
}
*/
public class GenericInterfaceImpl2<I> implements GenericInterface<I> {
@Override
public void method(I i) {
System.out.println(i);
}
}
8.泛型通配符——?
個人認為此部分重點有兩個:
- 泛型的上限:?extends E 代表只能使用E型別本身/子類
- 泛型的下限:?super E 代表只能使用E型別的本身/父類
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/229156.html
標籤:java
