問題引入
背景:DbUtils.list("from User")返回是List<Object>類型
需求:我們清楚的知道它的准確類型是List<User>,可能我們想直接的去進行類型的轉換
嘗試:List<User> listUser= (List<User>)DbUtils.list("from User");
結果:報錯
向下轉型
java中父類向下轉型為子類是沒問題的盡管存在類型安全的隱患:
1 Object o= new Object(); 2 User u= new User(); 3 u= (User)o; 4 o= u;
為Object是所有類型的父級,所以任何對象都可以去轉換成Object,因為有了這個繼承的特性,有可能Object指向了一個User,而我們又需要使用這個User的方法,所以它支持存在安全隱患的強制向下轉型,盡管存在安全隱患,但只要我們編碼時稍微注意就可避免此隱患,因為我們知道這個Object指向的是一個User,所以有繼承關系的向下類型轉換是可避免的安全隱患。
那么為什么List<User>和List<Object>轉就不行?
其實,這就像java中的二維數組初始化,你不能用下面的代碼申請出5行10數據,而要先申請5行,后一行一行的申請。
1 new int[5][10]
也就是說,集合是一個二層的結構,不適用於一層結構的類型強制轉換。在集合本身這一層來講,List<User>和List<Object>不是同一類,也沒有繼承關系。
不是同一類,沒有繼承關系的類不能強制類型轉換
1 String s= "a"; 2 Integer i= 12; 3 i= (Integer)s;
上面代碼在編譯期會報錯,下面的代碼在編譯期不報錯,到運行期才會拋異常。
1 String s= "a"; 2 Integer i= 12; 3 Object o= s; 4 i= (Integer)o;
集合類帶泛型轉換的辦法
既然我們無法直接轉換,而又不想一個元素一個元素的去轉類型,那么我們就間接的去轉換吧。
1,利用集合轉數組指定類型的api
1 List<User> listUser= Arrays.asList(DbUtils.list("from User").toArray(new User[0]));
2,和1差不多
1 List<User> listUser= new LinkedList<User>(); 2 Collections.addAll(listUser, DbUtils.list("from User").toArray(new User[0]));
3,使用Object做為中介者(超贊的一種思想)
1 List<User> listUser= (List<User>)(Object)DbUtils.list("from User");
4,和3差不多
1 Object object= DbUtils.list("from User"); 2 List<User> listCart= (List<User>)object;