Java中list<>的賦值
有一道迅雷的面試題是這樣的:
class A {}
class B extends A {}
class C extends A {}
class D extends B {}
Which four statements are true ?
A.The type List<A>is assignable to List
B.The type List<B>is assignable to List<A>
C.The type List<Object>is assignable to List<?>
D.The type List<D>is assignable to List<?extends B>
E.The type List<?extends A>is assignable to List<A>
F.The type List<Object>is assignable to any List reference
G.The type List<?extends B>is assignable to List<?extends A>
正確答案是:A C D G
分析過程:
1. 只看尖括號裏邊的!!明確點和範圍兩個概念
2.如果尖括號裏的是一個類,那麽尖括號裏的就是一個點,比如List<A>,List<B>,List<Object>
3. 如果尖括號裏面帶有問號,那麽代表一個範圍,<? extends A> 代表小於等於A的範圍,<? super A>代表大於等於A的範圍,<?>代表全部範圍
4.尖括號裏的所有點之間互相賦值都是錯,除非是倆相同的點
5.尖括號小範圍賦值給大範圍,對,大範圍賦值給小範圍,錯。如果某點包含在某個範圍裏,那麽可以賦值,否則,不能賦值
6.List<?>和List 是相等的,都代表最大範圍
7.List既是點也是範圍,當表示範圍時,表示最大範圍
代碼:
public static void main(String[] args) { List<A> a; List list; list = a; //A對,因為List就是List<?>,代表最大的範圍,A只是其中的一個點,肯定被包含在內 List<B> b; a = b; //B錯,點之間不能相互賦值 List<?> qm; List<Object> o; qm = o; //C對,List<?>代表最大的範圍,List<Object>只是一個點,肯定被包含在內 List<D> d; List<? extends B> downB; downB = d; //D對,List<? extends B>代表小於等於B的範圍,List<D>是一個點,在其中 List<?extends A> downA; a = downA; //E錯,範圍不能賦值給點 a = o; //F錯,List<Object>只是一個點 downA = downB; //G對,小於等於A的範圍包含小於等於B的範圍,因為B本來就比A小,B是A的子類嘛 }
以上解析來自牛客網網友 @曉宇大美女~
本文出自 “衛莨” 博客,請務必保留此出處http://acevi.blog.51cto.com/13261784/1972063
Java中list<>的賦值