標籤:exce 調用 get int eric 靜態 傳遞 img tor
一. 泛型概念的提出(為什麼需要泛型)?
首先,我們看下下面這段簡短的代碼:
public class GenericTest { public static void main(String[] args) { List list = new ArrayList(); list.add("qqyumidi"); list.add("corn"); list.add(100); for (int i = 0; i < list.size(); i++) { String name = (String) list.get(i); // 1 System.out.println("name:" + name); } } }
在如上的編碼過程中,我們發現主要存在兩個問題:
1.當我們將一個對象放入集合中,集合不會記住此對象的類型,當再次從集合中取出此對象時,改對象的編譯類型變成了Object類型,但其運行時類型任然為其本身類型。
2.因此,//1處取出集合元素時需要人為的強制類型轉化到具體的目標類型,且很容易出現“java.lang.ClassCastException”異常。
二.什麼是泛型?
泛型,即“參數化型別”。一提到參數,最熟悉的就是定義方法時有形參,然後調用此方法時傳遞實參。那麼參數化型別怎麼理解呢?顧名思義,就是將類型由原來的具體的型別參數化,類似於方法中的變數參數,此 時類型也定義成參數形式(可以稱之為類型形參),然後在使用/調用時傳入具體的類型(類型實參)。
三.泛型的使用
泛型有三種使用方式,分別為:泛型類、泛型介面、泛型方法
3.1 泛型類
T Type 表示類型。
K V 分別代表索引值中的Key Value。
E 代表Element。
注意:
1、泛型只能使用參考型別,不能基本類型
2、在泛型類裡,泛型聲明時字母不能使用 靜態屬性|靜態方法上,在泛型方法上可以聲明在方法上
package com.zwj.fanxing;/** * 泛型類:聲明時使用泛型 * 字母: * T Type 表示類型。 K V 分別代表索引值中的Key Value。 E 代表Element。 使用時確定類型 注意: 1、泛型只能使用參考型別,不能基本類型 2、泛型聲明時字母不能使用 靜態屬性|靜態方法上 * @author Administrator * * @param <T> */public class Student<T1,T2> { private T1 javaScore; private T2 oracleScore; //泛型聲明時不能使用 靜態屬性|靜態方法上 //private static T1 test; public T1 getJavaScore() { return javaScore; } public void setJavaScore(T1 javaScore) { this.javaScore = javaScore; } public T2 getOracleScore() { return oracleScore; } public void setOracleScore(T2 oracleScore) { this.oracleScore = oracleScore; } /** * @param args */ public static void main(String[] args) { //使用時指定類型(參考型別) Student<String,Integer> stu = new Student<String,Integer> (); //1、安全:類型檢查 stu.setJavaScore("優秀"); //2、省心:類型轉換 int it =stu.getOracleScore(); //自動拆箱 }}Student<T1,T2> 泛型類:聲明時使用泛型
3.2 泛型介面、
package com.zwj.fanxing;/** * 介面中 泛型字母只能使用在方法中,不能使用在全域常量中 * @author Administrator * * @param <T> */public interface Comparator<T> { void compare(T t); }Comparator 介面中 泛型字母只能使用在方法中,不能使用在全域常量中
package com.zwj.fanxing;/** * 泛型介面:與繼承同理 * 重寫方法隨父類而定 * * @param <T> */public interface package com.zwj.fanxing;/** * 泛型介面:與繼承同理 * 重寫方法隨父類而定 * * @param <T> */public interface Comparable<T> { void compare(T t);}//聲明子類指定具體類型class Comp implements Comparable<Integer>{ @Override public void compare(Integer t) { // TODO Auto-generated method stub } }//擦除class Comp1 implements Comparable{ @Override public void compare(Object t) { // TODO Auto-generated method stub } }//父類擦除,子類泛型class Comp2<T> implements Comparable{ @Override public void compare(Object t) { // TODO Auto-generated method stub } }//子類泛型>=父類泛型class Comp3<T> implements Comparable<T>{ @Override public void compare(T t) { // TODO Auto-generated method stub } }//父類泛型,子類擦除 錯誤{ void compare(T t);}//聲明子類指定具體類型class Comp implements Comparable<Integer>{ @Override public void compare(Integer t) { // TODO Auto-generated method stub } }//擦除class Comp1 implements Comparable{ @Override public void compare(Object t) { // TODO Auto-generated method stub } }//父類擦除,子類泛型class Comp2<T> implements Comparable{ @Override public void compare(Object t) { // TODO Auto-generated method stub } }//子類泛型>=父類泛型class Comp3<T> implements Comparable<T>{ @Override public void compare(T t) { // TODO Auto-generated method stub } }//父類泛型,子類擦除 錯誤Comparable 泛型介面:與繼承
3.3泛型方法
註:只能訪問對象的資訊,不能修改資訊
package com.zwj.fanxing;import java.io.Closeable;import java.io.IOException;/** * 泛型方法 <> 傳回型別前面 * 只能訪問對象的資訊,不能修改資訊 * @author Administrator * */public class TestMethod { /** * @param args */ public static void main(String[] args) { test("a"); //T -->String } //泛型方法 public static <T> void test(T a){ System.out.println(a); } // extends <= public static <T extends Closeable> void test(T... a){ for(T temp:a){ try { if(null!=temp){ temp.close(); } } catch (IOException e) { e.printStackTrace(); } } }}TestMethod 泛型方法 <> 傳回型別前面
java基礎--泛型