这篇文章给大家介绍如何在Java中定义和使用泛型,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
一 引入泛型背景
Java集合不会知道它们需要用它来保存什么类型的对象,所以他们把集合设计成能保存任何类型的对象,只要求具有很好的通用性。但这样做也带来两个问题:
二 不引入泛型的问题——编译时不检查类型的异常
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.String
8
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<String> strList = new ArrayList<String>(); // ①
strList.add("疯狂Java讲义");
strList.add("疯狂Android讲义");
// 下面代码将引起编译错误
//strList.add(5); // ②
strList.forEach(str -> System.out.println(str.length())); // ③
}
}
2 运行
8
11
3 说明
在集合中使用泛型后带来如下优势:
四 Java 7 泛型的菱形语法实战
1 代码
import java.util.*;
public class DiamondTest
{
public static void main(String[] args)
{
// Java自动推断出ArrayList的<>里应该是String
List<String> books = new ArrayList<>();
books.add("疯狂Java讲义");
books.add("疯狂Android讲义");
// 遍历books集合,集合元素就是String类型
books.forEach(ele -> System.out.println(ele.length()));
// Java自动推断出HashMap的<>里应该是String , List<String>
Map<String , List<String>> schoolsInfo = new HashMap<>();
// Java自动推断出ArrayList的<>里应该是String
List<String> schools = new ArrayList<>();
schools.add("斜月三星洞");
schools.add("西天取经路");
schoolsInfo.put("孙悟空" , schools);
// 遍历Map时,Map的key是String类型,value是List<String>类型
schoolsInfo.forEach((key , value) -> System.out.println(key + "-->" + value));
}
}
2 运行
8
11
孙悟空-->[斜月三星洞, 西天取经路]
关于如何在Java中定义和使用泛型就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。