Java多型遇到泛型型別

2021-08-11 20:44:17 字數 2540 閱讀 7984

1.陣列引數的多型化

(1):例項1

class animal

}class dog extends animal

}class cat extends animal

}class helloworld

; takinganimals(animals); }

public static void takinganimals(animal animals)

}

編譯和執行都可以通過

(2)例項2:

class animal

}class dog extends animal

}class cat extends animal

}class helloworld

; takinganimals(dogs); }

public static void takinganimals(animal animals)

}

編譯的時候不會出錯,但執行的時候會出錯,這是因為陣列型別是在執行期間檢查的,執行期間檢查到animlas[0]是dog型別,將cat型別的例項賦給它,會報錯

2.將上面的陣列array換成列表arraylist時:

集合引數的多型化:

(1)例項1:

class animal

}class dog extends animal

}class helloworld

public static void takinganimal(arraylistanimals) }

}

編譯可以通過,執行也可以通過

(2)例項2:

如果傳入takinganimal方法的是dog型別的列表

class animal

}class dog extends animal

}class helloworld

public static void takinganimal(arraylistanimals) }

}

編譯器無法通過,編譯器不讓通過是為了避免下面的情況,若傳入 takeanimals方法的是dog型別的列表dogs,這時無法將乙隻貓新增進dogs列表中,為什麼上面的陣列可以編譯通過呢,這是因為陣列的型別是在執行期間檢查的,而集合的型別檢查只會 發生在編譯期間

public void takeanimals(arraylistanimals)

3.多型化集合引數的辦法 :有一種能夠建立出接收animal子型引數的方法,就是使用萬用字元,萬字元有兩種語法形式

第一種語法:

public static void takinganimal(arraylist<? extends animal> animals)

}

第二種語法:

public staticvoid takinganimal(arraylistanimals)

}

使用萬用符的好處:傳入takinganimal方法的可能還是dogs列表,這樣dogs列表裡面還是可能被加進去cat型別的例項,但實際上使用帶有<?>的宣告時,編譯器不會允許加入任何東西到集合中。 

4.兩者的對比

public static void takinganimal(arraylistanimals)
與public static void takinganimal(arraylist<? extends animal> animals)的對比

<? extends animal>表示任何animal和animal的子型都是合法的,可以輸入arraylist,arraylist,arraylist型別的引數

arraylistanimals 表示只有arraylist型別是合法的

5.練習:

arraylistdog1 = new arraylist();
錯誤  說明:這個都不是多型,顯然錯誤

arraylistanimals = new arraylist();
錯誤  說明:正如上面分析的,集合的型別檢查會在編譯期間,編譯器不會允許這種形式的多型,將乙個dog型別的列表賦給animal型別列表

listanimals = new arraylist();
正確 說明:arraylist實現了list介面

arraylistdogs = new arraylist();
正確 說明:宣告了乙個dog型別的列表dogs

arraylistanimals = dogs;
錯誤 說明:正如上面分析的,集合的型別檢查會在編譯期間,編譯器不會允許這種形式的多型,將乙個dog型別的列表賦給animal型別列表

Java多型與泛型

一 多型理解 1 判斷是否是同乙個函式,通過唯一性標識 方法名 引數 順序 數量 型別一致 2 過載 引數 與 父類 不同 重寫 覆蓋 方法名 引數 與 父類 相同 3 多型分為編譯時多型 過載 和執行時多型 重寫 覆蓋 因為過載是不同的方法,編譯器能編譯的時候就確定是否呼叫該方法 而對於重寫,只有...

java 之多型與泛型

一 多型 多型的概念 按字面意思來理解就是多種狀態,也就是說同乙個物件在不同的地方表現出不同的狀態。比如介面的多種不同的實現方式即為多型。多型性是允許將父物件設定成為乙個或更多的他的 子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。簡單的說,就是一句話 允許將...

Java 泛型引數型別理解

泛型 generics extends super 1 泛型引數型別限制 1 泛型的引數型別只能是類 class 型別,而不能是簡單型別。2 可以宣告多個泛型引數型別,比如 同時還可以巢狀泛型,例如 3 泛型 的引數類 型可以使用 extends 語句,例如 4 泛型的引數型別可以使用 super ...