Java中如何定义和使用泛型
创始人
2024-12-22 07:21:29
0次

一 引入泛型背景

Java集合不会知道它们需要用它来保存什么类型的对象,所以他们把集合设计成能保存任何类型的对象,只要求具有很好的通用性。但这样做也带来两个问题:

集合对元素类型没有任何限制,这样可能引发一些问题:例如想创建一个只能保存Dog对象的集合,但程序也可以轻易地将Cat对象“丢”进去,所以可能引发异常。  由于把对象“丢进”集合时,集合丢失了对象的状态信息,集合只知道它盛装的是Object,因此取出集合元素后通常还需要进行强制类型转换。这种强制类型转换既会增加编程的复杂度、也可能引发ClassCastException。

二 不引入泛型的问题——编译时不检查类型的异常

1 代码

import java.util.*;public class ListErr{  public static void main(String[] args)  {   // 创建一个只想保存字符串的List集合   List strList = new ArrayList();   strList.add("疯狂Java讲义");   strList.add("疯狂Android讲义");   // "不小心"把一个Integer对象"丢进"了集合   strList.add(5);   // A处   strList.forEach(str -> System.out.println(((String)str).length())); // B处  }}

2 运行

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String8 at ListErr.lambda$main$0(ListErr.java:14)11 at java.util.ArrayList.forEach(ArrayList.java:1257) at ListErr.main(ListErr.java:14)

3 说明

程序在A处不小心把一个Integer对象“丢进”了List集合,这将导致程序在B处引发ClassCastException异常,因为程序试图把一个Integer对象转换为String类型。

三 引入泛型实战

1 代码

import java.util.*;public class GenericList{  public static void main(String[] args)  {   // 创建一个只想保存字符串的List集合   List strList = new ArrayList(); // ①   strList.add("疯狂Java讲义");   strList.add("疯狂Android讲义");   // 下面代码将引起编译错误   //strList.add(5);  // ②   strList.forEach(str -> System.out.println(str.length())); // ③  }}

2 运行

811

3 说明

在集合中使用泛型后带来如下优势:

程序再也不能“不小心”把其他对象“丢进”strList集合中,编译器会提示编译告警;  程序更加简洁,集合自动记住所有集合元素的数据类型,从而无需对集合元素进行强制类型转换。

四 Java 7 泛型的菱形语法实战

1 代码

import java.util.*;public class DiamondTest{  public static void main(String[] args)  {   // Java自动推断出ArrayList的<>里应该是String   List books = new ArrayList<>();   books.add("疯狂Java讲义");   books.add("疯狂Android讲义");   // 遍历books集合,集合元素就是String类型   books.forEach(ele -> System.out.println(ele.length()));   // Java自动推断出HashMap的<>里应该是String , List   Map> schoolsInfo = new HashMap<>();   // Java自动推断出ArrayList的<>里应该是String   List schools = new ArrayList<>();   schools.add("斜月三星洞");   schools.add("西天取经路");   schoolsInfo.put("孙悟空" , schools);   // 遍历Map时,Map的key是String类型,value是List类型   schoolsInfo.forEach((key , value) -> System.out.println(key + "-->" + value));  }}

2 运行

811孙悟空-->[斜月三星洞, 西天取经路]

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...