所以,泛型還有個特點是它不是協變的.
1
2
|
class A{} class B extends A{} List<A> list = new ArrayList<B>(); // 編譯不通過. 這裏ArrayList<A>才行. |
非協變性基本上解釋了爲什麼<? extends A>的時候,實例化出錯的原因.
只是我不明白,有泛型邊界這個概念,那它應該用在什麼地方.
泛型邊界指的是在運行時,容器中的引用類型實際狀態,在運行時你的容器類型都被擦除到了實際定義的上界,比如你寫 new ArrayList<? extends A>()
實際上在運行時只有 一個存放A類型引用的容器
但是ArrayList本身就是泛型容器,規定它的邊界 你只要給一個邊界就行了 ,然後你再往裏面放這個邊界的對象或則會是它的子類的對象都是可以的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class Ax{ } class Bx extends Ax{ } class Cx extends Ax{ } 。。。 List<Ax> list = new ArrayList<Ax>(); list.add( new Ax()); list.add( new Bx()); list.add( new Cx()); |
(1)聲明的時候可以指定一個大概範圍.
(2)但是實際處理中,只能是類型明確的集合.