首頁  >  文章  >  Java  >  Java中泛型是什麼? Java泛型的詳細介紹

Java中泛型是什麼? Java泛型的詳細介紹

不言
不言轉載
2018-10-19 16:28:533669瀏覽

本篇文章帶給大家的內容是關於Java中泛型是什麼? Java泛型的詳細介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

一、什麼是泛型?
Java泛型設計原則:只要在編譯時期沒有出現警告,那麼運行時期就不會出現ClassCastException異常.

泛型:把類型明確的工作延後到建立物件或呼叫方法的時候才去明確的特殊的型別

參數化型別:

ArrayList中的E稱為型別參數變數

ArrayList中的Integer稱為實際類型參數

整個稱為ArrayList泛型類型

整個ArrayList稱為參數化的類型ParameterizedType

二、為什麼需要泛型

有了泛型以後:

  • #程式碼更簡潔【不用強制轉換】

  • #程式比較健壯【只要編譯時期沒有警告,那麼運行時期就不會出現ClassCastException異常】

  • 可讀性與穩定性【在寫集合的時候,就限定了型別】

在建立集合的時候,我們明確了集合的型別了,所以我們可以使用增強for來遍歷集合!

//创建集合对象
ArrayList<String> list = new ArrayList<>();
list.add("hello");
list.add("world");
list.add("java");

//遍历,由于明确了类型.我们可以增强for
for (String s : list) {
    System.out.println(s);
}

三、泛型基礎
泛型類別就是把泛型定義在類別上,使用者使用該類別的時候,才把類型明確下來….這樣的話,使用者明確了什麼類型,這類就代表著什麼類型…使用者在使用的時候就不用擔心強轉的問題,執行時轉換異常的問題了。

在類別上定義的泛型,在類別的方法中也可以使用!

/*
    1:把泛型定义在类上
    2:类型变量定义在类上,方法中也可以使用
 */
    public class ObjectTool<T> {
        private T obj;
    
        public T getObj() {
            return obj;
        }
    
        public void setObj(T obj) {
            this.obj = obj;
        }
    }

使用者想要使用哪種類型,就在建立的時候指定類型。使用的時候,該類別就會自動轉換成使用者想要使用的類型了。

public static void main(String[] args) {

//创建对象并指定元素类型
ObjectTool<String> tool = new ObjectTool<>();

tool.setObj(new String("钟福成"));
String s = tool.getObj();
System.out.println(s);


//创建对象并指定元素类型
ObjectTool<Integer> objectTool = new ObjectTool<>();
/**
 * 如果我在这个对象里传入的是String类型的,它在编译时期就通过不了了.
 */
objectTool.setObj(10);
int i = objectTool.getObj();
System.out.println(i);

}

定義泛型方法….泛型是先定義後使用的

//定义泛型方法..
public <T> void show(T t) {
    System.out.println(t);
}

使用者傳遞進來的是什麼類型,傳回值就是什麼類型了

public static void main(String[] args) {
    //创建对象
    ObjectTool tool = new ObjectTool();

    //调用方法,传入的参数是什么类型,返回值就是什么类型
    tool.show("hello");
    tool.show(12);
    tool.show(12.5);

}

子類別明確泛型類別的類型參數變數

/*
    把泛型定义在接口上
 */
public interface Inter<T> {
    public abstract void show(T t);
}

實作泛型介面的類別…..

/**
 * 子类明确泛型类的类型参数变量:
 */

public class InterImpl implements Inter<String> {
    @Override
    public void show(String s) {
        System.out.println(s);
    }
}

四、泛型的應用程式
當我們寫網頁的時候,常常會有多個DAO,我們要寫每次都要寫好幾個DAO,這樣會有點麻煩。

public abstract class BaseDao<T> {

    //模拟hibernate....
    private Session session;
    private Class clazz;


    //哪个子类调的这个方法,得到的class就是子类处理的类型(非常重要)
    public BaseDao(){
        Class clazz = this.getClass();  //拿到的是子类
        ParameterizedType  pt = (ParameterizedType) clazz.getGenericSuperclass();  //BaseDao<Category>
        clazz = (Class) pt.getActualTypeArguments()[0];
        System.out.println(clazz);

    }


    public void add(T t){
        session.save(t);
    }

    public T find(String id){
        return (T) session.get(clazz, id);
    }

    public void update(T t){
        session.update(t);
    }

    public void delete(String id){
        T t = (T) session.get(clazz, id);
        session.delete(t);
    }

}

繼承抽象DAO,這實作類別就有對應的增刪改查的方法了。

public class CategoryDao extends BaseDao<Category> {

}
BookDao

public class BookDao extends BaseDao<Book> {

}

以上是Java中泛型是什麼? Java泛型的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除