1. 程式人生 > >Java中list<>的賦值

Java中list<>的賦值

java 基礎

有一道迅雷的面試題是這樣的:


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<>的賦值