在之前的文章我们介绍了一下 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 从入门到进阶之路(二十三)的更多相关文章

  1. Java 从入门到进阶之路(十三)

    在之前的文章我们介绍了一下 Java 类的 private,static,final,本章我们来看一下 Java 中的抽象类和抽象方法. 我们先来看下面一段代码: // 根据周长求面积 class S ...

  2. Java 从入门到进阶之路(二十)

    在之前的文章我们介绍了一下 Java 中的包装类,本章我们来看一下 Java 中的日期操作. 在我们日常编程中,日期使我们非常常用的一个操作,比如读写日期,输出日志等,那接下来我们就看一下 Java ...

  3. Java 从入门到进阶之路(二)

    之前的文章我们介绍了一下用 IDEA 编辑器创建一个 Java 项目并输出 HelloWorld,本章我们来看一下 Java 中的变量和基本数据类型. 在这之前我们先来看一下 Java 中的关键字,这 ...

  4. Java 从入门到进阶之路(十二)

    在之前的文章我们介绍了一下 Java 类的重写及与重载的区别,本章我们来看一下 Java 类的 private,static,final. 我们在之前引入 Java 类概念的时候是通过商场收银台来引入 ...

  5. Java 从入门到进阶之路(二十一)

    在之前的文章我们介绍了一下 Java 中的日期操作,本章我们来看一下 Java 集合框架中的Collection. 早在 Java 2 中之前,Java 就提供了特设类.比如:Dictionary, ...

  6. Java 从入门到进阶之路(二十二)

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 中的一些常用方法,本章我们来看一下 Java 集合框架中的Collection 的迭代器 Iterator. 当我们创建 ...

  7. Java 从入门到进阶之路(二十四)

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 的泛型,本章我们来看一下 Java 集合框架中的Collection 的子接口 List. Collection 接口有 ...

  8. Java 从入门到进阶之路(二十五)

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 的子接口 List的 增删改查和与数组间相互转换的方法,本章我们来看一下 Java 集合框架中的Collection 的 ...

  9. Java 从入门到进阶之路(二十六)

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 的子接口 List,本章我们来看一下 Java 集合框架中的Collection 的子接口 Queue. 在之前我们讲 ...

随机推荐

  1. LNMP PHP升级脚本

    升级PHP前,请确认你的网站程序是否支持升级到的PHP版本,防止升级到网站程序不兼容的PHP版本,具体可以去你使用的PHP程序的官网查询相关版本支持信息.v1.3及以后版本大部分情况下也可以进行降级操 ...

  2. Linux中查看磁盘大小、文件大小、排序方法小结

    一,查看磁盘空间大小的命令:dfdf命令用于查看磁盘分区上的磁盘空间,包括使用了多少,还剩多少,默认单位是KB 比如以下命令: df -hl执行结果如下: 执行的结果每列的含义: 第一列Filesys ...

  3. 机器人操作系统——ROS,Robot Operating System

    Note:偶然看到的滴滴研究院的无人驾驶竞赛,了解一下. ROS:专为机器人软件开发所设计出来的一套电脑操作系统架构.是一个开源的元级操作系统(后操作系统),提供类似操作系统的服务,包括硬件抽象描述. ...

  4. PIC16F887的LCD

    RS RA5 RW RA4 RD RA3 将引脚设置为输出的时候要对ANS5 ANS4 ANS3 设置为0

  5. [工具推荐]004.EXE签名工具SignTool使用教程

    数字证书,真是个神奇的东西,可以保证软件不被修改,可以表明文件的发布日期,最重要的,可以很大程度的减少杀毒软件的误报,当然,这就要使用可信任的机构颁发的证书了. 现在要说的不是申请证书,而是如何制作自 ...

  6. 相邻元素margin的自动合并与float的坑

    css中相邻元素的margin其实是会自动合并的,且取较大值. <!DOCTYPE html> <html lang="en"> <head> ...

  7. apt-key 密钥管理,apt-secure 原理 验证链 验证测试

    apt-key 用于管理Debian Linux系统中的软件包密钥.每个发布的deb包,都是通过密钥认证的,apt-key用来管理密钥. apt-key list 列出已保存在系统中key.包括 /e ...

  8. Chisel3 - 运算符和位宽推断

    https://mp.weixin.qq.com/s/rI-CJM6GyI6EUHPZ3uYiFg   如同Verilog中的众多运算符,Chisel也针对自身的数据类型,提供了很多运算符.   Ch ...

  9. Java实现 蓝桥杯 算法训练 相邻数对(暴力)

    试题 算法训练 相邻数对 问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1. 输入格式 输入的第一行包含一个整数n,表示给定整数的个数. 第二行包含所给定的n个整数. 输出格式 ...

  10. java实现购物券消费方案

    公司发了某商店的购物券1000元,限定只能购买店中的m种商品.每种商品的价格分别为m1,m2,-,要求程序列出所有的正好能消费完该购物券的不同购物方法. 程序输入: 第一行是一个整数m,代表可购买的商 ...