首頁 > Java > java教程 > 主體

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

不言
發布: 2018-10-19 16:28:53
轉載
3666 人瀏覽過

本篇文章帶給大家的內容是關於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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!