java 定义泛型变量_Java泛型定义与用法入门示例

本文实例讲述了Java泛型定义与用法。分享给大家供大家参考,具体如下:

一 引入泛型背景

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.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 strList = new ArrayList(); // ①

strList.add("疯狂Java讲义");

strList.add("疯狂Android讲义");

// 下面代码将引起编译错误

//strList.add(5); // ②

strList.forEach(str -> System.out.println(str.length())); // ③

}

}

2 运行

8

11

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 运行

8

11

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

3 说明

菱形语法对原有的泛型并没有改变,只是更好地简化了泛型编程。

希望本文所述对大家java程序设计有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值