瞭解泛型,遠離渣男

1 哈嘍

講個笑裏藏刀的故事,認真聽哦
哈哈哈哈哈刀哈哈哈哈哈哈
還記得齊碼嗎,我回來了
在這裏插入圖片描述


目錄

  1. 泛型(這個無趣)
  2. 通配符(這個無趣)
  3. 爲什麼使用泛型(這個還行)
  4. 它和渣男有啥區別(這個有趣趣)
  5. 總結(這個有趣趣趣)

如有錯誤或者不足請指出,聯繫方式QQ2714730493。


2 泛型

2.1 泛型的作用

泛型簡單易用

類型安全 泛型的主要目標是實現java的類型安全。 泛型可以使編譯器知道一個對象的限定類型是什麼,這樣編譯器就可以在一個高的程度上驗證這個類型

消除了強制類型轉換 使得代碼可讀性好,減少了很多出錯的機會

Java語言引入泛型的好處是安全簡單。泛型的好處是在編譯的時候檢查類型安全,並且所有的強制轉換都是自動和隱式的,提高代碼的重用率

2.2 泛型的原理

泛型的實現是靠類型擦除技術,類型擦除是在編譯期完成的,也就是在編譯期 ,編譯器會將泛型的類型參數都擦除成它的限定類型,如果沒有則擦除爲object類型之後在獲取的時候再強制類型轉換爲對應的類型。 在運行期間並沒有泛型的任何信息,因此也沒有優化

2.3 泛型的使用
2.3.1 泛型類

泛型類:具有一個或多個類型變量的類,稱之爲泛型類

class A<T> {

}

class B<k,v>{

}
2.3.1 泛型方法

泛型方法:具有一個或多個類型變量的方法,稱之爲泛型方法

public <T> T fun(T t) {

}
//但是請注意: public void fun(T t1){} ,不是泛型方法。
2.4 泛型的規則
2.4.1 泛型可以使用在返回類型和參數類型上面
class A<T> {
    public T fun(T t) {
        return  t;
    }
}
2.4.2 泛型可以使用在成員變量上面和類型上面
class A<T> {
	private T bean;
}
2.4.3 泛型可以使用在局部變量上面
class A<T> {
    public void fun2(T t) {
        T b =t;
    }
}
2.4.4 泛型不可以new
class A<T> {
	A a=new A();//報錯
}
2.4.5 在創建泛型類實例時,需要爲其類型變量賦值
class A<T> {
    A<String>a = new A<String>();
}
2.4.6 泛型方法與泛型類沒什麼關係,泛型方法不一定非要在泛型類中
2.5 泛型的缺陷
2.5.1 侷限性一

集合等號兩邊所傳遞的值必須相同否則會報錯,原因就是Java中的泛型有一個擦除的機制,就是所編譯器期間編譯器認識泛型,但是在運行期間Java虛擬機就不認識泛型了。

List<String> list = new ArrayList<String>();
List<Object>list2 = new ArrayList<String>();//異常
2.5.2侷限性二

泛型擦除和第一點一樣

public void fun(List<Object> list){
    System.out.println("泛型方法");
}
public void test(){
    List<String>list = new ArrayList<String>();
    fun(list);//報錯
}

3 通配符

3.1 通配符“?”
public void fun(List<? extends Object> list){
    System.out.println("泛型方法");
}
public void test(){
    List<String>list = new ArrayList<String>();
    //也可以這樣寫
    //List<?> list = new ArrayList<String>();
    fun(list);//報錯
}
3.2 通配符不能使用在new的後面

因爲如果寫在new的後面不就相當於直接確定類型變量了嗎,那麼這就不是通配符了

3.3 通配符的侷限性
3.3.1 參數類型爲和返回值爲通配符的方法是不能使用的
public void print(List<?> list) {
	list.add("hello");//編譯異常
	list.get(0);
}
3.3.2 通配符可以繼承

? extends Number,這個時候通配符就被限制爲了Number和Number的子類型
參數類型爲通配符的泛型不能用,但是返回值類型爲泛型的可以用

public void print(List<? extends Number > list) {
    list.add(1);//報錯
    Number num = list.get(0);
}

因爲參數類型爲泛型的時候,參數可以爲long的,也可能是Integer的還可能是其他類型,而返回值爲泛型的,就可以用Number來接收了。

3.3.3 通配符可以有上界

? super Integer,這個時候通配符就被限制爲了Integer和” Integer的父類型
返回值類型爲泛型的不能用,但是參數類型爲通配符的泛型的可以用

public void print(List<? super Number > list) {
    list.add(1);
    Number num = list.get(0);//報錯
}

因爲返回值爲泛型的時候,返回值可以爲Number的,也可能是Object的還可能是其他類型就是Integer的父類型,會發生泛型擦除,而參數爲泛型的,就可以放入Integer或者Integer的父類就可以了。

4 爲什麼使用泛型

先看看請求後臺接口回傳的數據

正確返回:
{
“status”:1,
“msg"登錄成功”,
“data”:{“app_user_id”:“xxxxx”,
“app_user_type”:“xxxxx”,
“mobile”:“122222”}
}

賬戶密碼錯誤後的錯誤返回信息:
{
“status”:0,
“msg”:“請求成功”,
“data”:{“app_user_id”:“xxxxx”,
“app_user_type”:“xxxxx”}
}

最外面是不是一樣的,但是date這個屬性,一下子是兩個數據的對象,一下子是多個數據的對象,我該如何處理解析呢。
如果你用原生的一層一層解析,前面的當我沒說。

4.1 創建請求Model
public class RequestModel<T> {
    private int status;
    private String msg;
    private T data;
    public void setStatus(int status) {
        this.status = status;
    }
    public int getStatus() {
        return status;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public String getMsg() {
        return msg;
    }
    public void setData(T data) {
        this.data = data;
    }
    public T getData() {
        return data;
    }
}
4.2 舉例,請求獲取Json數據Gson解析如何泛型data對象
//第一個對象解析
RequestModel<dataOneModel> requestModel = gson.fromJson(json,new TypeToken<RequestModel<dataOneModel>>(){}.getType());
//第二個對象解析
RequestModel<dataTwoModel> requestModel = gson.fromJson(json,new TypeToken<RequestModel<dataTwoModel>>(){}.getType());

5 它和渣男有啥區別

哈哈,這個我真不會。
既然看了我博客,我教你一點點
使用泛型(請自律),提升自己的代碼效率(價值),就能遠離編碼無趣(渣男)。

6 emmm

我知道我有時候很傻很天真,被人記住了也不在乎,我真誠的想和你們好好的。我是Android程序員,請諒解我的直,我的傻。
在這裏插入圖片描述
點贊,加薪,脫單,瘦十斤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章