Java 从入门到进阶之路(二十三)
在之前的文章我们介绍了一下 Java 中的 集合框架中的Collection 的迭代器 Iterator,本章我们来看一下 Java 集合框架中的Collection 的泛型。
在讲泛型之前我们先来看下面一段代码:
 public class Main {
     public static void main(String[] args) {
         Point point = new Point(1, 2);
         point.setX(2);
         int ix = point.getX();
         System.out.println(ix); // (2, 2)
         /**
          * 如果想要 x 值变为 double 类型则可以强转为 double 类型
          * */
         point.setX(2);
         double dx = (double) point.getX();
         System.out.println(dx); // 2.0
     }
 }
 class Point {
     private int x;
     private int y;
     public Point(int x, int y) {
         this.x = x;
         this.y = y;
     }
     public int getX() {
         return x;
     }
     public void setX(int x) {
         this.x = x;
     }
     public int getY() {
         return y;
     }
     public void setY(int y) {
         this.y = y;
     }
     @Override
     public String toString() {
         return "(" + x + ", " + y + ")";
     }
 }
上面的代码我们之前的文章讲过,我们可以通过传入 x 和 y 值来定义 Point 点,如果我们想要 double 类型的点时需要造型为 double 类型,那我要定义汉字类型的呢?那就造型成 String 类型,这就很麻烦,每次都需要自己来造型,有种鞋不合脚的感觉,那能不能定义我想要什么类型就是什么类型呢,如下:
 public class Main {
     public static void main(String[] args) {
         Point<Integer> point1 = new Point<Integer>(1, 2); // 必须是包装类
         point1.setX(1);
         System.out.println(point1.getX()); //
         Point<Double> point2 = new Point<Double>(1.1, 2.1); // 必须是包装类
         point2.setX(1.2);
         System.out.println(point2.getX()); // 1.2
         Point<String> point3 = new Point<String>("一", "二"); // 必须是包装类
         point3.setX("三");
         System.out.println(point3.getX()); // 三
     }
 }
 /**
  * 泛型
  * 又称参数化类型,是将当前类的属性的类型,方法参数的类型及方法
  * 返回值的类型的定义权移交给使用者,
  * 使用者在创建当前类的同时将泛型的试剂类型传入
  * 数字和字母组合,数字不能开头
  */
 class Point<T> { // 定义为泛型 T 类型
     private T x;
     private T y;
     public Point(T x, T y) {
         this.x = x;
         this.y = y;
     }
     public T getX() {
         return x;
     }
     public void setX(T x) {
         this.x = x;
     }
     public T getY() {
         return y;
     }
     public void setY(T y) {
         this.y = y;
     }
     @Override
     public String toString() {
         return "(" + x + ", " + y + ")";
     }
 }
从上面的代码中,我们定义了一个 T 的类型 Point,当我们要实例化该类时,根据自己的需求传入想要的包装类类型即可,这样就满足了不同的需求,各取所需。
泛型从底层来说其实就是 Object,定义了泛型只是编译器在做一些验证工作,当我们对泛型类型设置值时,会检查是否满足类型要求,当我们获取一个泛型类型的值时,会自动进行类型转换。
在平时我们是很少自己来定义泛型的,泛型是用来约束集合中元素的类型,如下:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator; public class Main {
public static void main(String[] args) {
Collection<String> collection = new ArrayList<String>(); // 只能添加 String 类型的元素
collection.add("one");
collection.add("two");
collection.add("thee");
collection.add("four");
// collection.add(1); // 编译错误
for (String string : collection) {
System.out.println(string); // one two three four
}
Iterator<String> iterator = collection.iterator();
while (iterator.hasNext()) {
// String string = (String) iterator.next(); 不需要再造型
String string = iterator.next();
System.out.println(string); // one two three four
}
}
}
Java 从入门到进阶之路(二十三)的更多相关文章
- Java 从入门到进阶之路(十三)
		在之前的文章我们介绍了一下 Java 类的 private,static,final,本章我们来看一下 Java 中的抽象类和抽象方法. 我们先来看下面一段代码: // 根据周长求面积 class S ... 
- Java 从入门到进阶之路(二十)
		在之前的文章我们介绍了一下 Java 中的包装类,本章我们来看一下 Java 中的日期操作. 在我们日常编程中,日期使我们非常常用的一个操作,比如读写日期,输出日志等,那接下来我们就看一下 Java ... 
- Java 从入门到进阶之路(二)
		之前的文章我们介绍了一下用 IDEA 编辑器创建一个 Java 项目并输出 HelloWorld,本章我们来看一下 Java 中的变量和基本数据类型. 在这之前我们先来看一下 Java 中的关键字,这 ... 
- Java 从入门到进阶之路(十二)
		在之前的文章我们介绍了一下 Java 类的重写及与重载的区别,本章我们来看一下 Java 类的 private,static,final. 我们在之前引入 Java 类概念的时候是通过商场收银台来引入 ... 
- Java 从入门到进阶之路(二十一)
		在之前的文章我们介绍了一下 Java 中的日期操作,本章我们来看一下 Java 集合框架中的Collection. 早在 Java 2 中之前,Java 就提供了特设类.比如:Dictionary, ... 
- Java 从入门到进阶之路(二十二)
		在之前的文章我们介绍了一下 Java 中的 集合框架中的Collection 中的一些常用方法,本章我们来看一下 Java 集合框架中的Collection 的迭代器 Iterator. 当我们创建 ... 
- Java 从入门到进阶之路(二十四)
		在之前的文章我们介绍了一下 Java 中的 集合框架中的Collection 的泛型,本章我们来看一下 Java 集合框架中的Collection 的子接口 List. Collection 接口有 ... 
- Java 从入门到进阶之路(二十五)
		在之前的文章我们介绍了一下 Java 中的 集合框架中的Collection 的子接口 List的 增删改查和与数组间相互转换的方法,本章我们来看一下 Java 集合框架中的Collection 的 ... 
- Java 从入门到进阶之路(二十六)
		在之前的文章我们介绍了一下 Java 中的 集合框架中的Collection 的子接口 List,本章我们来看一下 Java 集合框架中的Collection 的子接口 Queue. 在之前我们讲 ... 
随机推荐
- JZOJ 4611. 【NOI2016模拟7.11】接水问题 (贪心+A*+可持久化线段树)
			Description: https://gmoj.net/senior/#main/show/4611 题解: 先把A从大到小排序,最小的由排序不等式显然. 考虑类似第k短路的A*的做法. 定义状态 ... 
- vue-cli3的eslint配置问题
			vue-cli3按照官网教程配置搭建后,发现每次编译,eslint都抛出错误 error: Expected indentation of 4 spaces but found 0 (indent) ... 
- ansible模块详解
			[简单介绍] Ansible是一种agentless(基于ssh),可实现批量配置.命令执行和控制,基于Python实现的自动化运维工具. 有以下两个特性: 模块化:通过调用相关模块,完成指定任务,且 ... 
- Python操作Word与Excel并打包
			安装模块 # Word操作库 pip install docx # Excel操作库 pip install openpyxl # 打包exe工具 pip install pyinstaller Wo ... 
- [Node.js]001.安装与环境配置
			安装与环境配置 第一步:下载安装文件 第二步:安装nodejs 第三步:npm安装 第四步:安装相关环境 第五步:安装CoffeeScript 第六步:CoffeeScript测试实例 第一步:下载安 ... 
- 用python编写测试脚本
			def f(n): """ >>>f(1) 1用例 >>>f(2) 2用例 ...... >>>f(n) n用例 & ... 
- Unity 离线建造系统
			很多游戏,特别是养成类手游,都会有自己独特的建造系统,一个建造装置的状态循环或者说生命周期一般是这样的: 1.准备建造,设置各项资源的投入等 2.等待一段倒计时,正在建造中 3.建造结束,选择是否收取 ... 
- 记一次使用windbg排查内存泄漏的过程
			一.背景 近期有一个项目在运行当中出现一些问题,程序顺利启动,但是观察一阵子后发现内存使用总量在很缓慢地升高, 虽然偶尔还会往下降一些,但是总体还是不断上升:内存运行6个小时候从33M上升到80M: ... 
- 数据库之 MySQL --- 数据处理 之 子查询  (二)
			个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一 .数据库语言定义及命令行查看数据库操作 -- SQL 语言可以分为三类-- DML: 数据操纵语言. ... 
- LeetCode 74,直击BAT经典面试题
			本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题43篇文章,我们今天来看一下LeetCode当中的74题,搜索二维矩阵,search 2D Matrix. 这题的 ... 
