1.简介
(1).概念
Java允许在定义方法、类和接口时不指定具体的数据类型,而是在范型方法被调用、范型类被实例化、范型接口被实现时再指定具体数据类型,这样便可以让数据类型变得参数化。

(2).范型擦除和补偿
泛型技术是给编译器使用的,编译器在检查完后,生成的.class文件中不带泛型,原因是泛型是 JDK5.0以后出现的技术,类加载器不能识别,这叫做擦除。在运行过程中,又带有泛型,原因是类加载器获取.class字节码文件,根据运行时类中的数据类型,进行类强制转换,这叫做泛型补偿。

(3).范型字母含义

  • E:Element
  • T:Type
  • K:Key
  • V:Value
  • N:Number

(4).演示案例

public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}//get和set方法
}
public class Student extends Person {public Student(String name, int age) {super(name, age);}@Overridepublic String toString() {return "Student{}";}
}
public class Worker extends Person {public Worker(String name, int age) {super(name, age);}@Overridepublic String toString() {return "Worker{}";}
}

2.泛型类

public class Tool<T>{private T t;public T getT() {return t;}public void setT(T t) {this.t = t;}
}
public class GenericDemo {public static void main(String[] args) {Tool<Student> tool = new Tool<>();tool.setT(new Student("steven",30));//报错tool.setT(new Worker("steven",30));System.out.println(tool.getT());}
}
Student{}

3.泛型方法

public class Tool<T> {private T t;public T getT() {return t;}public void setT(T t) {this.t = t;}public static <E> void printElement(E[] inputArray) {for (int i = 0; i < inputArray.length; i++) {System.out.println(inputArray[i]);}System.out.println();}
}
public class GenericDemo {public static void main(String[] args) {String [] stringArray = new String[]{"book","fruit","sport"};Integer [] interArray = new Integer[]{123,12345,123456};Tool.printElement(stringArray);Tool.printElement(interArray);}
}
book
fruit
sport123
1234
12345

getT()不是泛型方法,printElement是泛型方法,主要区别在于泛型方法有<>修饰。

4.泛型接口

public interface IGeneric<T> {T getT();
}
class GenericStudentImpl implements IGeneric<Student>{@Overridepublic Student getT() {return new Student("steven",30);}public static void main(String[] args) {GenericStudentImpl genericStudent = new GenericStudentImpl();Student student = genericStudent.getT();System.out.println(student);}
}
Student{}

5.泛型边界
(1).上限extends

public class GenericDemo {public static void main(String[] args) {List<Person> personList = new LinkedList<Person>();personList.add(new Person("steven", 27));personList.add(new Person("sherry", 20));print(personList);System.out.println();List<Student> studentList = new LinkedList<>();studentList.add(new Student("owen", 22));studentList.add(new Student("mike", 25));print(studentList);System.out.println();List<Worker> workerList = new LinkedList<>();workerList.add(new Worker("jan", 23));workerList.add(new Worker("tom", 24));print(workerList);}private static void print(Collection<? extends Person> coll) {Iterator<?> it = coll.iterator();while (it.hasNext()) {Person p = (Person) it.next();System.out.println("name:" + p.getName() + ",age:" + p.getAge());}}
}
name:steven,age:27
name:sherry,age:20name:owen,age:22
name:mike,age:25name:jan,age:23
name:tom,age:24

(2).下限super

public class GenericDemo {public static void main(String[] args) {List<Person> personList = new LinkedList<Person>();personList.add(new Person("steven", 27));personList.add(new Person("sherry", 20));print(personList);System.out.println();List<Student> studentList = new LinkedList<>();studentList.add(new Student("owen", 22));studentList.add(new Student("mike", 25));print(studentList);System.out.println();//编译不通过//List<Worker> workerList = new LinkedList<>();//workerList.add(new Worker("jan", 23));//workerList.add(new Worker("tom", 24));//print(workerList);}private static void print(Collection<? super Student> coll) {Iterator<?> it = coll.iterator();while (it.hasNext()) {Person p = (Person) it.next();System.out.println("name:" + p.getName() + ",age:" + p.getAge());}}
}
name:steven,age:27
name:sherry,age:20name:owen,age:22
name:mike,age:25

2.1 Java范型相关推荐

  1. java 范型 约束

    转自: http://www.myexception.cn/mobile/692129.html 向作者致谢! -------------------------------------------- ...

  2. java范型_Java知识点总结(Java泛型)

    Java知识点总结(Java泛型) @(Java知识点总结)[Java, Java泛型] [toc] 泛型 泛型就是参数化类型 适用于多种数据类型执行相同的代码 泛型中的类型在使用时指定 泛型归根到底 ...

  3. java 范型 隐式 显式_隐式与显式接口实现

    用外行的话来说,如果一个类继承自2个或更多接口,并且这些接口碰巧具有相同的方法名,则如果您使用隐式接口实现,则该类将不知道正在实现哪种接口方法.这是您显式实现接口时的场景之一. 隐式接口实现 publ ...

  4. java范形_java范型简介

    java范型简介 一.简单认识java范型 经常听人说"范型",我一直不是太明白什么叫"范型",今天就查阅了一些文章,给我的第一感觉就是之所以在java中用范型 ...

  5. 范型方法 范型参数 范型返回值

    Java范型类 public class FanXingClassTest {public static void main(String args[]){Test<Integer> in ...

  6. java数组的协变_Java数组协变与范型不变性

    变性是OOP语言不变的大坑,Java的数组协变就是其中的一口老坑.因为最近踩到了,便做一个记录.顺便也提一下范型的变性. 解释数组协变之前,先明确三个相关的概念,协变.不变和逆变. 一.协变.不变.逆 ...

  7. Java 数组转型和范型

    今天写代码遇到一个奇怪的问题,代码结构如下: [java] view plaincopy print? ArrayList<String> list = new ArrayList< ...

  8. 「Java基础」范型

    范型概述 1 范型是为了解决什么问题? 范型的出现是为了解决安全问题,它限制数据传入的类型,下面举例说明 // Demo1: 不使用范型ArrayList al = new ArrayList(); ...

  9. java comparator泛型_Java Comparator的范型类型推导问题

    问题 在项目中,有一处地方需要对日期区间进行排序 我需要以日期区间的开始日为第一优先级,结束日为第二优先级进行排序 代码 我当时写的代码如下: List> dateIntervals = new ...

最新文章

  1. Redis 读写分离技术架构解析
  2. 数据库学习day_01:SQL的发展和数据库操作相关sql语句
  3. Jenkins部署Windows UI自动化的调度权限问题
  4. asp.net性能的技巧
  5. 【独立游戏】黎明之刃——3D硬核ARPG游戏
  6. linux 解压所有以zip结尾的文件_在 Linux 上压缩文件:zip 命令的各种变体及用法...
  7. Java-代理模式的理解
  8. twitter mysql_twitter-mysql改进点
  9. VMware创建Ubuntu操作系统到网络配置详细流程
  10. android开发模板web,Android开发实践:Android.mk模板
  11. [Xilinx]Xilinx ISE14.2中调用文本编辑器NotePad++设置方法
  12. Burpsuite Professional安装及使用教程(抓包)
  13. VS2019插件VSIX开发
  14. layer.open(常用)
  15. NTFS文件系统详解(二)之MBR(EBR)基本信息
  16. 面对复杂问题时,系统思考助你理解问题本质
  17. android 动态、静态壁纸实现
  18. 用Python代码来下载任意指定网易云歌曲
  19. 高中生参加的计算机奥赛是,电脑奥赛中最寂寥的竞赛 5学生夺牌直通清华
  20. 瓶子机器人diy制作大全_塑料瓶回收改造成电动机器人玩具

热门文章

  1. 详解HTTP协议(二)
  2. Android数据存储安全实践
  3. 微信输入法语音转文字的设计点
  4. 车间制造管理系统(下)
  5. 提高转化率和获取手淘流量的技巧方法,如何提高转化率?
  6. element el-table 计算指定列
  7. 2013,让你正能量无限的话
  8. # 个人日记-电影《盛夏未来》观后感-20210802
  9. Mac保留文件重装系统
  10. 历届CSP真题题解-CSP刷真题之路