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