java之泛型_java之泛型
什么是泛型?
泛型是JDK1.5新加入的,解决数据类型的安全性问题,其主要原理是在类声明时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这样在类声明或实例化时只要指定好需要的具体的类型即可。
为什么要有泛型?
java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁、健壮。
java中的泛型只有在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息檫出,并且在对象和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行阶段。
举个例子:在利用泛型声明一个集合之后,例如List list = new ArrayList();在进行list.add(1);时就会提示:The method add(int, String) in the type List is not applicable for the arguments (int),此时仍处于编译阶段。
怎么使用泛型?
1.泛型类
packagecollections;importjava.util.ArrayList;importjava.util.List;public classTest6 {public static voidmain(String[] args) {
A a1 = new A();//这里setKey中接受的参数为String类型,因为在实例化的时候声明了String泛型
a1.setKey("a");
System.out.println(a1.getKey());
A a2 = new A();//这里setKey中接受的参数为Integer类型,因为在实例化的时候声明了Integer泛型
a2.setKey(1);
System.out.println(a2.getKey());
A a3= newA();//假设不指定泛型,那么默认接受为Object
a3.setKey(1);
System.out.println(a3.getKey());//同样的类,指定了不同的泛型,就不能进行相互赋值,比如a1=a2
}
}//此处的泛型T可以任意取名,一般用T,表示Type
class A{privateT key;public voidsetKey(T key){this.key =key;
}publicT getKey(){return this.key;
}
}
2.泛型接口
packagecollections;public classTest7 {public static voidmain(String[] args) {
Mm mm = new Mm();
mm.test(1);//这种情况下不能指定泛型
Mn mn = newMn();
mn.test("a");
}
}interface M{
T test(T t);
}//未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需要将泛型的声明也一起加入到类中
class Mm implements M{
@OverridepublicT test(T t) {//TODO Auto-generated method stub
return null;
}
}//传入实参时,则需要都修改成实参
class Mn implements M{
@OverridepublicString test(String t) {//TODO Auto-generated method stub
return null;
}
}
3.泛型方法
packagecollections;public classTest8 {public static voidmain(String[] args) {
P p = new P();
p.test("aa");//泛型方法在调用前没有固定的数据类型//在调用时,传入的参数是什么类型,就会把泛型改成什么类型
p.test1(1);
p.test1(true);
}
}class P{//在类上定义的泛型,可以在普通方法中使用
privateE e;public static voidtest3(T t) {//在静态方法中不能使用类定义的泛型,如果要使用泛型,只能使用静态方法自己定义的泛型
System.out.println(t);
}//无返回值的泛型
public voidtest(T t) {
}//有返回值的泛型
public T test1(T s) {
System.out.println(this.e);returns;
}//带有可变参数方法的泛型
public voidtest2(T... args) {for(T arg:args) {
System.out.println(arg);
}
}
}
4.通配符?
packagecollections;importjava.util.ArrayList;importjava.util.List;public classTest9 {public static voidmain(String[] args) {
Q q= newQ();
List list1 = new ArrayList();
q.test(list1);
List list2 = new ArrayList();
q.test(list2);
}
}classQ{//test里面需要传递一个集合List,但是不知道List里面参数的类型
public void test(List>list) {
}
}
有限制的通配符: extends Person> [无穷小, Person] 只允许泛型为Person及Person子类的引用调用
super Person> [Person, 无穷大] 只允许泛型为Person及Person父类的引用调用
extends Comparable 只允许泛型为Comparable接口的实现类引用调用
packagecollections;importjava.util.ArrayList;importjava.util.List;public classTest9 {public static voidmain(String[] args) {
Q q= newQ();
List b1 = new ArrayList();
List c1 = new ArrayList();
List d1 = new ArrayList();//q.test1(b1);传入b1会报错
q.test1(c1);
q.test1(d1);//q.test2(d1);传入d1会报错
List m1Impl = new ArrayList();
q.test3(m1Impl);
}
}classQ{//test里面需要传递一个集合List,但是不知道List里面参数的类型
public void test(List>list) {
}//参数的元素数据类型为C1及其子类
public void test1(List extends C1>list) {}//参数的元素数据类型为C1及其父类
public void test2(List super C1>list) {}//参数的元素数据类型为C1及其父类
public void test3(List extends M1>list) {}
}classA1{
}class B1 extendsA1{}class C1 extendsB1{}class D1 extendsC1{}interfaceM1{}class M1Impl implements M1{}
java之泛型_java之泛型相关推荐
- java中什么时候不能用泛型_java中泛型的正确使用姿势
image.png 泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用.利用好泛型,在系统架构中是一把利器. 泛型类 先看一个例子,restful架构中,需要定义api接口返回 ...
- java支持泛型_Java自学-泛型 支持泛型的类
Java 如何设计支持泛型的类 步骤 1 : 不支持泛型的Stack 以Stack栈为例子,如果不使用泛型 当需要一个只能放Hero的栈的时候,就需要设计一个HeroStack 当需要一个只能放Ite ...
- java 文件通配符_Java中泛型通配符的使用方法示例
本文实例讲述了Java中泛型通配符的使用方法.分享给大家供大家参考,具体如下: 一 点睛 引入通配符可以在泛型实例化时更加灵活地控制,也可以在方法中控制方法的参数. 语法如下: 泛型类名 extend ...
- java 泛型方法 实例化_Java让泛型实例化的方法
泛型对象可以实例化吗? 不可以,T t=new T()是不可以的,编译器会报错.由于泛型擦除,编译器在编译时无法确定泛型所对应的真实类型 解决方法 使用反射新建实例 Type superclass = ...
- java interface泛型_java – 使用泛型和接口实现组合
我正在努力实现以下目标: 我的类X有一个通用的Y.然而,这个泛型Y需要访问X的资源,我想通过接口来处理它,以便允许其他人继承任意选择的类. 然而,我目前的方法会产生一系列泛型: public inte ...
- java 通配符 泛型_java中泛型之类型通配符(?)
实体类 package cn.xy.model; /** * 生物类 * @author xy * */ public class Living { private String name; publ ...
- java 类型通配符_java中泛型之类型通配符(?)
实体类 package cn.xy.model; /** * 生物类 * @author xy * */ public class Living { private String name; publ ...
- hashmap 泛型_Java 基础 - 泛型
背景 在没有泛型前,一旦把一个对象丢进集合中,集合就会忘记对象的类型,把所有的对象都当成 Object 类型处理.当程序从集合中取出对象后,就需要进行强制类型转换,这种转换很容易引起 ClassCas ...
- 泛型java 代码讲解_Java泛型详解
2516326-5475e88a458a09e4.png 一,打破砂锅问到底 泛型存在的意义? 泛型类,泛型接口,泛型方法如何定义? 如何限定类型变量? 泛型中使用的约束和局限性有哪些? 泛型类型的继 ...
最新文章
- CTA核心技术及应用峰会开幕!(附第二日参会攻略)
- LUOGU P4195 Spoj3105 Mod
- git教程——简单总结
- 2.5 程序示例--非线性决策边界-机器学习笔记-斯坦福吴恩达教授
- ATen(A TENsor library for C++11)剖析(1)
- 调焦后焦实现不同距离成像_如何用手机拍出单反的效果,系列学习(一)AF参数“自动调焦”...
- LeetCode 1736. 替换隐藏数字得到的最晚时间
- 全链路压测自动化实践 1
- Linux内核分析(八) 设备驱动
- 基于ext4j的带jar文件的java程序打包方法
- es6标准入门第3版pdf_最详细,快速入门Web前端开发的正确姿势
- IIS配置Url重写实现http自动跳转https的重定向方法(100%解决)
- 转载:KOF97键盘连招
- 等式约束凸二次规划(拉格朗日乘子法)_python
- Oracle SQL调优系列之AWR报告简介
- YOLOv5 Android(完结)
- 输入法只能打拼音不能打汉字
- 联通光猫IPV6配置
- 什么是829计算机专业,2020考研湖南大学计算机专业829程序设计试卷特点分析
- android如何在登录界面嵌入图片,Android内嵌H5页面调用手机图片操作
热门文章
- JQuery设置checkbox的值,取checkbox的值,设置radio的值,取radio的值,设置下拉选select的值,取select的值...
- 注册页面所涉及的知识
- WPF 动态模拟CPU 使用率曲线图
- Typescript,Vue you enjoy it ?
- 搞懂单链表常见面试题
- 英国继银行被窃之后 信贷公司Wonga数十万客户数据被泄
- pcre库文件的安装
- 如何用Powerdesigner的PDM(物理数据模型)生成数据库及逆向工程(将现有的数据库生成PDM)(转)...
- python模拟登录qq账号密码_最新的Python模拟登陆QQ脚本,一键批量登录,强行过验证!...
- ssha java接口_java – 从Spring在LDAP中设置SSHA密码