java之学习泛型的概述和基本使用

泛型概述

泛型:是一种把类型明确的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。参数化类型,把类型当作参数一样的传递

泛型的前世今生

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。

在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译的时候没有错误提示,在运行的时候才出现异常,这样安全隐患。当有了泛型之后, 对数据类型做了限制,只有在同种引用类型才可以编译通过,否则在编译期就报错,这样的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。

泛型好处

  1. 提高安全性(将运行期的错误转换到编译期)
  2. 省去强转的麻烦

泛型基本使用

<>中放的必须是引用数据类型

泛型使用注意事项

前后的泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型)


泛型分类

  • 泛型类:顾名思义就是把泛型定义在类上
    1. 格式:public class 类名<泛型类型1,…>
    2. 注意事项:泛型类型必须是引用类型
  • 泛型接口:顾名思义就是把泛型定义在接口上
    1. 格式:public interface 接口名<泛型类型>
  • 泛型方法:顾名思义就是把泛型定义在方法上
    1. 格式:public <泛型类型> 返回类型 方法名(泛型类型 变量名)

泛型通配符<?>

任意类型,如果没有明确,那么就是Object以及任意的Java类了

  1. ? extends E:向下限定,E及其子类
  2. ? super E    :向上限定,E及其父类

​​​当右边的泛型是不确定时,左边可以指定为?

案例代码

泛型类:


package com.fenxiangbe.bean;

public class Tools<T> {

private T t;

public T getT() {

return t;

}

public void setT(T t) {

this.t = t;

}

public void show(){

System.out.println(“abc”);

}

}

结果示意图:

请点击此处输入图片描述

泛型方法:


package com.fenxiangbe.bean;

public class Tools<T> {

private T t;

public T getT() {

return t;

}

public void setT(T t) {

this.t = t;

}

public<S> void show(S s){

System.out.println(“abc”);

}

}


结果示意图:

请点击此处输入图片描述

​泛型接口:


package com.fenxiangbe.list;

public class Demo_Interface {

public static void main(String[] args) {

}

}

interface i<T> {

public void show (T t);

}

class Demo implements i<String>{

@Override

public void show(String t) {

System.out.println(t);

}

}


泛型通配符<?>

案例代码:

package com.fenxiangbe.list;

import java.util.ArrayList;

import com.fenxiangbe.bean.Person;

import com.fenxiangbe.bean.Student;

public class Demo_Generic {

public static void main(String[] args) {

ArrayList<Person> l1 = new ArrayList<>();

l1.add(new Person(“张三”, 23));

l1.add(new Person(“李四”, 24));

l1.add(new Person(“王五”, 25));

ArrayList<Student> l2 = new ArrayList<>();

l2.add(new Student(“赵六”, 26));

l2.add(new Student(“洪七”, 27));

l1.addAll(l2);

System.out.println(l1);

}

}


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

第二十天 IO-异常file类【悟空教程】

在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理。

15150
来自专栏编程

《4》python数据类型和变量

(4)python数据类型和变量 ? 整数 Python可以处理任意大小的整数,例如:1,100,-8080,0,等等。 十六进制用0x前缀和0-9,a-f表示...

36090
来自专栏java学习

Java每日一练(2017/6/15)

题目要求 本期题目: 1、(单选题) What will be printed when you execute the following code? cla...

368100
来自专栏个人随笔

Java 高级开发必修知识---反射

程序猿们经常说的一句话:反射反射。。。程序员的快乐 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的...

44450
来自专栏我和PYTHON有个约会

11.程序编程基础5:输入输出

python提供了3种输入输出标准文件对象,分别为标准输入、标准输出和标准错误;分别对应了sys模块中的sys.stdin,sys.stdout,sys.std...

11420
来自专栏用户2442861的专栏

Python补充11 序列的方法 正则表达式 (re包)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

10710
来自专栏夏时

PHP 特色:可变变量

15340
来自专栏偏前端工程师的驿站

Java魔法堂:解读基于Type Erasure的泛型

一、前言                               还记得JDK1.4时遍历列表的辛酸吗?我可是记忆犹新啊,那时因项目需求我从C#转身到Jav...

23250
来自专栏Java学习网

Java面试题系列之基础部分(二)——每天学5个问题

Java基础部分学习的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io的语法,虚拟机方面的语法,这些都是最基...

27850
来自专栏偏前端工程师的驿站

Java魔法堂:解读基于Type Erasure的泛型

一、前言                               还记得JDK1.4时遍历列表的辛酸吗?我可是记忆犹新啊,那时因项目需求我从C#转身到Jav...

22580

扫码关注云+社区

领取腾讯云代金券