摘要:層次結(jié)構(gòu)如上所示,的子類都可以作為集合的元素加入到集合中,并且不會有任何影響。在實際編碼中一般都建議使用類型安全的容器,這樣不容易出錯,出錯也會在編譯期間就會展現(xiàn)出來。
概述
說起類型安全的容器,那么什么是類型不安全的容器呢?容器用來存儲數(shù)據(jù),常見的存儲數(shù)據(jù)的容器有數(shù)組和集合,數(shù)組有以下特點:
長度固定
只能存儲同一種類型的數(shù)據(jù)
因為數(shù)組只能存儲同一種數(shù)據(jù)類型的數(shù)據(jù),那么它就是類型安全的容器,因為集合可以存儲任意類型的數(shù)據(jù),比如我可以在List中存儲一個Apple、一個Orange,但是在取的時候我不知道它們是什么,只知道它們是Object,這樣,我以為取出來的是Apple,但是取出來了一個Orange,我又想要用Apple的種子種蘋果,但是漲出來發(fā)現(xiàn)時橘子。
實例 類型不安全的容器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屬性
出現(xiàn)運行時異常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 在創(chuàng)建List的時候加入了泛型,使其只能放入Apple
在試圖加入Orange的時候會出現(xiàn)編譯器異常
在取對象的時候不需要強制轉(zhuǎn)換為Apple,因為編譯器已經(jīng)知道存儲的是Apple
向上轉(zhuǎn)型使用泛型明確指定某個類型作為泛型參數(shù)的時候,并不僅限于將該對象放置到容器中,向上轉(zhuǎn)型也可以像其他類型一樣作用于泛型。
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
層次結(jié)構(gòu)如上所示,Apple的子類都可以作為集合的元素加入到集合中,并且不會有任何影響。
在實際編碼中一般都建議使用類型安全的容器,這樣不容易出錯,出錯也會在編譯期間就會展現(xiàn)出來。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/65137.html
摘要:如果一個程序只包含固定數(shù)量且其生命周期都是已知的對象,那么這是一個非常簡單的程序。 如果一個程序只包含固定數(shù)量且其生命周期都是已知的對象,那么這是一個非常簡單的程序。 1.泛型和類型安全的容器 通過使用泛型,可以在編譯期防止將錯誤類型的對象放置到容器中. 2.基本概念 Java容器類庫的用途是保存對象,并將其劃分為兩個不同的概念:Collection,Map. Collection...
摘要:總結(jié)數(shù)組與泛型的關(guān)系還是有點復(fù)雜的,中不允許直接創(chuàng)建泛型數(shù)組。本文分析了其中原因并且總結(jié)了一些創(chuàng)建泛型數(shù)組的方式。 簡介 上一篇文章介紹了泛型的基本用法以及類型擦除的問題,現(xiàn)在來看看泛型和數(shù)組的關(guān)系。數(shù)組相比于Java 類庫中的容器類是比較特殊的,主要體現(xiàn)在三個方面: 數(shù)組創(chuàng)建后大小便固定,但效率更高 數(shù)組能追蹤它內(nèi)部保存的元素的具體類型,插入的元素類型會在編譯期得到檢查 數(shù)組可以持...
摘要:參數(shù)化的類型其中是參數(shù)化的類型。類型參數(shù)的實例或?qū)嶋H類型參數(shù)其中是類型參數(shù)的實例或?qū)嶋H類型參數(shù)。它們并沒有重載,而且泛型中也不存在重載這一說法。除此之外,我們應(yīng)該盡量地多用泛型方法,而減少對整個類的泛化,因為泛型方法更容易把事情說明白。 泛型是適用于許多許多的類型 ---《JAVA編程思想》 在Java的面向?qū)ο缶幊踢^程中, 或許你知道運用繼承、接口等一系列面向?qū)ο蟮膭幼鱽韺崿F(xiàn)代碼復(fù)用...
摘要:前言編程思想這本書,陸陸續(xù)續(xù)讀了年,終于基本都瀏覽了一遍。每個對象對外暴露接口,程序通過對象暴露的接口向?qū)ο蟀l(fā)送消息,獲取該對象的服務(wù)能力。異常處理異常處理,為編寫程序階段提供了一種預(yù)見性的防止程序崩潰的出路。 前言 《Java編程思想》這本書,陸陸續(xù)續(xù)讀了1年,終于基本都瀏覽了一遍。通過這本書,試圖理解作者的想法,才真的體會到Java思想。感謝本書的作者,不僅講述了java的語法,更...
閱讀 3706·2023-04-25 14:20
閱讀 1305·2021-09-10 10:51
閱讀 1226·2019-08-30 15:53
閱讀 529·2019-08-30 15:43
閱讀 2396·2019-08-30 14:13
閱讀 2867·2019-08-30 12:45
閱讀 1273·2019-08-29 16:18
閱讀 1255·2019-08-29 16:12