JAVA泛型的简单思考一

对于熟悉JAVA语言的coder来说,泛型绝对曾让自己伤透脑筋,因为java中的泛型就像是一个糖果,但嚼起来却痛苦不堪(可能有点过分,不过看很多论坛贴吧的抱怨,我觉得也是不可否认的)。每个初涉泛型的人可能都会经历这样的阶段,什么是泛型,为什么会有泛型,怎么样使用泛型,它能给我们带来什么?等等
      其实早在JDK1.5之前,java还不存在泛型,但java语言是强类型,编译型语言,而且我们强调要尽早的(编译期间)发现异常解决异常,然而没有泛型我们可能会遇到这样的问题:

List fruits = new ArrayList();
fruits.add(new Apple());
fruits.add(new Egg());
fruits.add(new People());
((Fruit) fruits.get(2)).juice();//it's horrible,and exception will be checked delaying runtime
       
 以上的代码告诉我们,在没有泛型时我们可以将任何的类型添加到一个水果篮中,但我们希望的只是水果,可此时编译器无法发现问题的所在,因为编译器对此毫无所知,你必须到运行时才能发现问题的所在,这可不是我们想要的结果。
为了避免这样的不爽,SUN 的工程师们从JDK1.5开始引进了泛型来解决一系列无法在编译器发现的类型问题,但将上面的代码通过泛型进行优化后我们会发现:
   
List<Fruit> fruits = new ArrayList <Fruit>();
fruits.add( new Apple());
fruits. add(new Egg());//bad fruit
fruits. add(new People());//bad fruit
fruits.get(0).juice();//it's fruit ,you can get juice

此时你只能将水果放入你的水果篮,因为这个水果篮是编译器强制要求的,我们通过<T>这样的语法告诉编译器我们需要的是果篮而不是其他什么~!这样当你使用水果篮中的水果是你可以确切的知道,我拥有的是水果我可以榨取果汁。这就是泛型带给我们的,它可以确保我们的类型安全,我们不会再试图把一个People榨出果汁来,而编译器却毫无在乎。
可能你会好奇JAVA 是如何通过泛型来进行编译器的安全监察的,其实这只是编译器的一个小手段,它会透明的为我们进行类型的强制转换,而强制转换的依据便是你声明在尖括号中的类型。看一下编译后再反编译的的代码你就会明白了:
   
List fruits = new ArrayList();
fruits.add(new Apple());
Fruit fruit = (Fruit)fruits.get(0);

你可能会有点失望,为什么还是类型装换,这跟我们自己做的有什么区别的,相信很多人都会抱怨,尤其是熟悉C++模板的coder。但我们也不能过于责备SUN的工程师们,因为这是为了兼容以前的JDK版本,为了让低版本中编写的代码依旧可以运行在支持泛型的JVM上,这是一个对用户负责的考虑。让我们来看一下编译器是怎么处理我们的泛型代码的:
当我们写好了一个泛型代码时,尖括号中的类型总是会通知编译器,我们需要的类型,编译器便会在需要类型安全的地方进行类型转化,而当他发现你使用的不是匹配类型时便会抛出一个编译时异常,而不需要等到运行时。
当然泛型并不只是在容器中使用(虽然这是应用最多的地方,尤其是对应用开发人员)但我们还有泛型类,泛型方法,泛型数组需要理解,不过中心思想还是上面讲到的这些,都是编译器把戏,我们需要了解的是为了达到一个目的,编译器做了什么,为什么这么做就足够了。
本数据集来源于 2024 年 7 月在江西省中东部余干县、贵溪市、金溪县丘陵林地采集的千枚岩、红砂岩、花岗岩母质发育红壤关键带剖面土壤实测数据,空间覆盖 3 个县域不同岩性风化壳林地,采样点位经纬度分别为千枚岩剖面 P10(116.8316°E,28.5269°N)、红砂岩剖面 P08(117.1048°E,28.3492°N)、花岗岩剖面 P04(116.6883°E,27.9963°N);垂直空间采样深度存在差异,千枚岩与花岗岩剖面采样深度 0~600 cm,红砂岩剖面采样深度 0~450 cm,垂直分层采样分辨率为 0~50 cm 区间分 0~20 cm、20~50 cm 两层,50 cm 以下土层以 50 cm 为固定间隔分层,整套数据集共包含 36 条土壤剖面分层记录,其中 P10 千枚岩剖面 13 条、P08 红砂岩剖面 11 条、P04 花岗岩剖面 13 条。数据采集时间为 2024 年 7 月,实验室理化指标、矿物测试、酸碱滴定及统计建模工作于 2024 年 7 月 —2026 年 5 月完成,无时间序列连续监测数据,仅为单次野外剖面采样静态数据集。 数据集包含野外剖面基础信息、土壤酸碱滴定原始数据、土壤酸度指标、交换性盐基与交换性酸、土壤机械组成、有机质、黏土与原生矿物半定量 XRD 数据、无定形 / 晶形铁铝氧化物含量。全量理化指标计量单位统规范:酸缓冲容量 pHBC 单位为 cmol・kg⁻¹・pH⁻¹,交换性酸、交换性盐基离子单位为 cmol・kg⁻¹,矿物以质量百分比(%)表示,、黏粒 / 粉粒 / 砂粒、有机质、铁铝氧化物单位均为g/kg,pH 为无量纲数值。 覆盖范围: 中位纬度: 28.2616 中位经度: 116.89654999999999 南界纬度: 27.9963 西界经度: 116.6883 北界纬度: 28.5269 东界经
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值