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. 在之前我们讲 ...
随机推荐
- 将BeyondCompare设置为TortoiseSVN的扩展比较工具
1)点击鼠标右键 -> 点击TortoiseSVN -> Settings,如下图: 2)选择Diff Viewer - > 选择External(并配置好参数),具体如下图: 3) ...
- PHP持久配置容器Yaconf
PHP持久配置容器Yaconf的安装及使用 Yaconf介绍:Yaconf是一个配置容器,它解析ini文件,在PHP启动时将结果存储在PHP中,配置存在于整个PHP生命周期中,这使得它非常快. 要求: ...
- SpringMVC笔记总结
文章所有代码见:gitee 1.回顾MVC 1.1.什么是MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务逻辑.数据.显示分离 ...
- Collection接口和list,set子类
Collection接口常用的子接口有:List接口.Set接口List接口常用的子类有:ArrayList类.LinkedList类Set接口常用的子类有:HashSet类.LinkedHashSe ...
- linux 去除^M 换行符
一般,在windows下写的shell脚本,都会去linux执行,都会有^M 符号,那么怎么去除呢? 第一种方法:cat -A filename 就可以看到windows下的断元字符 ^M要去除他,最 ...
- Java基本语法---标识符、变量、数据类型转换及进制
Java基本语法 标识符 标识符:凡事可以自己起名字的地方,都可以叫做标志符 标识符命名规则: 26个字母大小写,数字0-9,下划线_,美元符号$ 数字不能开头 不能使用关键字和保留字,但是可以包含 ...
- Redis详解(九)------ 哨兵(Sentinel)模式详解
在上一篇博客----Redis详解(八)------ 主从复制,我们简单介绍了Redis的主从架构,但是这种主从架构存在一个问题,当主服务器宕机,从服务器不能够自动切换成主服务器,为了解决这个问题,我 ...
- 【JVM】体系结构及其细节
JVM JVM运行在操作系统之上,与硬件没有直接的交互.引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译.Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语 ...
- @Spring Boot程序员,我们一起给程序开个后门吧:让你在保留现场,服务不重启的情况下,执行我们的调试代码
前言 这篇其实是对一年前的一篇文章的补坑. @Java Web 程序员,我们一起给程序开个后门吧:让你在保留现场,服务不重启的情况下,执行我们的调试代码 当时,就是在spring mvc应用里定义一个 ...
- 安装和换源pip
pip 是 Python 包管理工具,该工具提供了对Python 包的查找.下载.安装.卸载的功能 一.ubuntu安装和配置pip 1.进入终端,输入命令sudo su root ,输入密码后进入r ...