Java 理解泛型的基本含义
Java 泛型
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
泛型方法
你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。
下面是定义泛型方法的规则:
- 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的<E>)。
- 每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
- 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
- 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char的等)。
实例:
public class ElementDemo { public static void main(String[] args) { //<Integer>运行时类型
//使用泛型后,如果实例化是定义的类型与对象传入的类型不一致,就会在编译时期报错。
Test<Integer> t1 = new Test<>();
t1.add(666); Test<String> t2 = new Test<>();
t2.add("cjj");
}
} /**
* "E" 在这里并没有实际意义,你也可以用别的字母代替
* 它的作用就是在实例化Test类的时候,传入什么类型它就调用什么类型
*/
class Test<E>{
public void add(E e) { System.out.println(e);
}
}
注意:
泛型的命名只要符合标识符的命名规则即可
习惯上泛型一般只使用一个大写字母进行命名
<T> type
<E> element 元素类型
<K> key
<V> value
<R> result/return
泛型向下兼容
<? extends 类/接口>
import java.util.ArrayList;
import java.util.List; public class ElementDemo {
public static void main(String[] args) { //实例化一个Integer类型的数组列表对象,里面存储的数据都是int型数据
List<Integer> in = new ArrayList<>();
in.add(1);
in.add(2);
in.add(3);
in.add(4);
in.add(5);
in.add(6);
//实例化一个Double类型的数组列表对象,里面存储的数据都是Double类型的
List<Double> dos = new ArrayList<>();
dos.add(3.6);
dos.add(4.2);
dos.add(6.8);
dos.add(7.7);
dos.add(0.2); //调用方法
print(in);
print(dos);
} // 写一个新的方法来遍历元素类型是数字的列表
// 元素类型是Number或者是其子类
// ? extends 类/接口 表示传入这个类/接口或者是其子类/子接口对象
// 所能传入的元素的最大类型限定为Number
// 规定了泛型的上限
public static void print(List<? extends Number> list) { //在方法体里面不能再往对象里添加元素,null除外
list.add(null); //打印对象里面的元素
System.out.println(list);
}
}
向上造型规定了泛型的上限,上限的子类都可以向泛型方法传入对象。
泛型向下兼容
<? extends 类/接口>
import java.util.ArrayList;
import java.util.List; public class ElementDemo1 {
public static void main(String[] args) { List<String> str = new ArrayList<>();
str.add(0, "cjj"); print(str);
} // 泛型的下限
// 传入元素类型是String及其父类的列表
// ? super 类/接口 表示传入这个类/接口及其父类/父接口的对象
// 表示传入的最小类型是String
public static void print(List<? super String> list) { //方法体里面可以添加元素
list.add("add"); for(Object o : list){
System.out.println(o);
}
}
}
向上造型规定了泛型的下限,下限的fu类都可以向泛型方法传入对象。
Java 理解泛型的基本含义的更多相关文章
- 深入理解Java之泛型
原文出处: absfree 1. Why ——引入泛型机制的原因 假如我们想要实现一个String数组,并且要求它可以动态改变大小,这时我们都会想到用ArrayList来聚合String对象.然而,过 ...
- Java 中泛型的全面解析(转)
Java泛型(generics) 是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在J ...
- 跟着刚哥梳理java知识点——泛型(十三)
一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: public class GenericTest { public static void main(String[] a ...
- C++ Java C#泛型
泛型概述C#中的泛型C#泛型和java泛型的比较C#泛型和C++模板的比较C#泛型中的约束 泛型概述 Bruce Eckel :您能对泛型做一个快速的介绍么? Anders Hejlsberg : 泛 ...
- Android开发之深入理解泛型extends和super的区别
摘要: 什么是泛型?什么是擦除边界?什么是上界限定或下界限定(子类型限定或超类型限定)?什么是类型安全?泛型extends关和super关键字结合通配符?使用的区别,两种泛型在实际Android开发中 ...
- Java中泛型在集合框架中的应用
泛型是Java中的一个重要概念,上一篇文章我们说过,当元素存入集合时,集合会将元素转换为Object类型存储,当取出时也是按照Object取出的,所以用get方法取出时,我们会进行强制类型转换,并且通 ...
- 十:Java之泛型
[定义] 一.泛型的定义主要有下面两种: 在程序编码中一些包括类型參数的类型,也就是说泛型的參数仅仅能够代表类.不能代表个别对象.(这是当今较常见的定义) 在程序编码中一些包括參数的类.其參数能够代表 ...
- Java中泛型 类型擦除
转自:Java中泛型是类型擦除的 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类 ...
- [转] Java 的泛型擦除和运行时泛型信息获取
原文链接 https://my.oschina.net/lifany/blog/875769 前言 现在很多程序员都会在简历中写上精通 Java.但究竟怎样才算是精通 Java 呢?我觉得不仅要熟练掌 ...
随机推荐
- Vue+Webpack配置css-loader时报错:Module build failed: Unknown word
使用Vue+Webpack搭建工程时,在webpack.config.js中的module的rules里针对各种文件配置加载工具.在针对css文件配置时遇到一个问题:打包构建时报错——Module b ...
- Python学习札记(四十三) IO 3
参考:操作文件和目录 NOTE: 1.Python内置的os模块可以直接调用操作系统提供的接口函数: 2.os.name 打印操作系统的名称:如果是posix,说明系统是Linux.Unix或Mac ...
- DDMS
DDMS 的全称是Dalvik Debug Monitor Service,是 Android 开发环境中的Dalvik虚拟机调试监控服务
- [转] VR-FORCES 介绍
转自:https://sanwen8.cn/p/1e6GQeK.html 今天给各位介绍的仿真平台是VR-Forces.VR-Forces是新加坡公司MAK的产品,前身是美国公司.在仿真平台领域里面, ...
- javascript之分时函数
在一些开发场景中,我们可能会一次性向文档中注入上千个节点,在短时间内向浏览器中大量添加DOM节点可能会让浏览器吃不消,结果往往会让浏览器卡顿或吃不消,解决方案之一便是使用分时函数(timeChunk) ...
- Mongo配置基础
数据库也是一种服务,数据库的本质也是一个文件,所以说我们把文件存入text和存入数据库的本质是一样的,只是数据库的格式化的删除和添加. 分为四部分, mongo的启动详解 导入导出,运行时备份 Fsy ...
- Java Spring-JdbcTemplate
2017-11-10 22:55:45 Spring 对持久层技术支持 : JDBC : org.springframework.jdbc.core.JdbcTemplate Hibernate3.0 ...
- SQLPLUS的乱码问题
我的中文系统,把对应非unicode字符时的设置,改成了 日文, 结果控制台使用sqlplus时候,总是出现乱码. 解决方法是,把NLS_LANG环境变量变成跟系统一样,就可以了. american_ ...
- 6-9 😢 5小时的debug: 从rails 命令运行超慢开始->删除rails->删除ruby->删除rvm->安装上rvm->安装上ruby
上午,莫名其妙的rails app不能用了,rails -v一查发现不存在.ruby -v发现是2.0的版本.很着急上火,因为很少使用过rvm这个ruby版本控制器.所以照官网文档.从新安装ruby, ...
- 用于调试的printf函数和自定义log函数
1. 用宏定义调试用的DPRINT #define DEBUG_ENABLE #ifdef DEBUG_ENABLE #define DPRINT(fmt, args...) fprintf(stde ...