摘要:層次結構如上所示,的子類都可以作為集合的元素加入到集合中,并且不會有任何影響。在實際編碼中一般都建議使用類型安全的容器,這樣不容易出錯,出錯也會在編譯期間就會展現出來。
概述
說起類型安全的容器,那么什么是類型不安全的容器呢?容器用來存儲數據,常見的存儲數據的容器有數組和集合,數組有以下特點:
長度固定
只能存儲同一種類型的數據
因為數組只能存儲同一種數據類型的數據,那么它就是類型安全的容器,因為集合可以存儲任意類型的數據,比如我可以在List中存儲一個Apple、一個Orange,但是在取的時候我不知道它們是什么,只知道它們是Object,這樣,我以為取出來的是Apple,但是取出來了一個Orange,我又想要用Apple的種子種蘋果,但是漲出來發現時橘子。
實例 類型不安全的容器class Apple{ private static long counter; private final long id = counter++; public long id(){ return id; } } class Orange{ } public class ApplesAndOrangesWithoutGenerics { @SuppressWarnings("unchecked") public static void main(String[] args) { ArrayList apples = new ArrayList(); for(int i = 0; i<3; i++){ apples.add(new Apple()); } apples.add(new Orange()); for (int i = 0; i@SuppressWarnings:不受檢查的異常,也就是可以抑制警告信息
存儲進去三個Apple對象和一個Orangle對象
想取出Orange的id屬性
出現運行時異常ClassCastException: net.sailfishc.holding.Orange cannot be cast to net.sailfishc.holding.Apple
類型安全的容器(泛型)class Apple{ private static long counter; private final long id = counter++; public long id(){ return id; } } class Orange{ } public class ApplesAndOrangesWithoutGenerics { public static void main(String[] args) { ArrayListapples = new ArrayList (); for(int i = 0; i<3; i++){ apples.add(new Apple()); } // apples.add(new Orange()); for (int i = 0; i 在創建List的時候加入了泛型,使其只能放入Apple
在試圖加入Orange的時候會出現編譯器異常
在取對象的時候不需要強制轉換為Apple,因為編譯器已經知道存儲的是Apple
向上轉型使用泛型明確指定某個類型作為泛型參數的時候,并不僅限于將該對象放置到容器中,向上轉型也可以像其他類型一樣作用于泛型。
class GrannySmith extends Apple{} class Gala extends Apple{} class Fuji extends Apple{} class Braeburn extends Apple{} public class GenericsAndUpcasting { public static void main(String[] args) { ArrayListapples = new ArrayList (); apples.add(new Gala()); apples.add(new GrannySmith()); apples.add(new Fuji()); apples.add(new Braeburn()); for (Apple apple : apples) { System.out.println(apple); } List list1 = new ArrayList (); List list2 = new LinkedList (); } }
Apple
GrannySmith
Gala
Fuji
Braeburn
層次結構如上所示,Apple的子類都可以作為集合的元素加入到集合中,并且不會有任何影響。
在實際編碼中一般都建議使用類型安全的容器,這樣不容易出錯,出錯也會在編譯期間就會展現出來。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65137.html
摘要:如果一個程序只包含固定數量且其生命周期都是已知的對象,那么這是一個非常簡單的程序。 如果一個程序只包含固定數量且其生命周期都是已知的對象,那么這是一個非常簡單的程序。 1.泛型和類型安全的容器 通過使用泛型,可以在編譯期防止將錯誤類型的對象放置到容器中. 2.基本概念 Java容器類庫的用途是保存對象,并將其劃分為兩個不同的概念:Collection,Map. Collection...
摘要:總結數組與泛型的關系還是有點復雜的,中不允許直接創建泛型數組。本文分析了其中原因并且總結了一些創建泛型數組的方式。 簡介 上一篇文章介紹了泛型的基本用法以及類型擦除的問題,現在來看看泛型和數組的關系。數組相比于Java 類庫中的容器類是比較特殊的,主要體現在三個方面: 數組創建后大小便固定,但效率更高 數組能追蹤它內部保存的元素的具體類型,插入的元素類型會在編譯期得到檢查 數組可以持...
摘要:參數化的類型其中是參數化的類型。類型參數的實例或實際類型參數其中是類型參數的實例或實際類型參數。它們并沒有重載,而且泛型中也不存在重載這一說法。除此之外,我們應該盡量地多用泛型方法,而減少對整個類的泛化,因為泛型方法更容易把事情說明白。 泛型是適用于許多許多的類型 ---《JAVA編程思想》 在Java的面向對象編程過程中, 或許你知道運用繼承、接口等一系列面向對象的動作來實現代碼復用...
摘要:前言編程思想這本書,陸陸續續讀了年,終于基本都瀏覽了一遍。每個對象對外暴露接口,程序通過對象暴露的接口向對象發送消息,獲取該對象的服務能力。異常處理異常處理,為編寫程序階段提供了一種預見性的防止程序崩潰的出路。 前言 《Java編程思想》這本書,陸陸續續讀了1年,終于基本都瀏覽了一遍。通過這本書,試圖理解作者的想法,才真的體會到Java思想。感謝本書的作者,不僅講述了java的語法,更...
閱讀 3570·2023-04-25 14:20
閱讀 1188·2021-09-10 10:51
閱讀 1150·2019-08-30 15:53
閱讀 456·2019-08-30 15:43
閱讀 2313·2019-08-30 14:13
閱讀 2791·2019-08-30 12:45
閱讀 1203·2019-08-29 16:18
閱讀 1159·2019-08-29 16:12