2.1 Java范型
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范型相关推荐
- java 范型 约束
转自: http://www.myexception.cn/mobile/692129.html 向作者致谢! -------------------------------------------- ...
- java范型_Java知识点总结(Java泛型)
Java知识点总结(Java泛型) @(Java知识点总结)[Java, Java泛型] [toc] 泛型 泛型就是参数化类型 适用于多种数据类型执行相同的代码 泛型中的类型在使用时指定 泛型归根到底 ...
- java 范型 隐式 显式_隐式与显式接口实现
用外行的话来说,如果一个类继承自2个或更多接口,并且这些接口碰巧具有相同的方法名,则如果您使用隐式接口实现,则该类将不知道正在实现哪种接口方法.这是您显式实现接口时的场景之一. 隐式接口实现 publ ...
- java范形_java范型简介
java范型简介 一.简单认识java范型 经常听人说"范型",我一直不是太明白什么叫"范型",今天就查阅了一些文章,给我的第一感觉就是之所以在java中用范型 ...
- 范型方法 范型参数 范型返回值
Java范型类 public class FanXingClassTest {public static void main(String args[]){Test<Integer> in ...
- java数组的协变_Java数组协变与范型不变性
变性是OOP语言不变的大坑,Java的数组协变就是其中的一口老坑.因为最近踩到了,便做一个记录.顺便也提一下范型的变性. 解释数组协变之前,先明确三个相关的概念,协变.不变和逆变. 一.协变.不变.逆 ...
- Java 数组转型和范型
今天写代码遇到一个奇怪的问题,代码结构如下: [java] view plaincopy print? ArrayList<String> list = new ArrayList< ...
- 「Java基础」范型
范型概述 1 范型是为了解决什么问题? 范型的出现是为了解决安全问题,它限制数据传入的类型,下面举例说明 // Demo1: 不使用范型ArrayList al = new ArrayList(); ...
- java comparator泛型_Java Comparator的范型类型推导问题
问题 在项目中,有一处地方需要对日期区间进行排序 我需要以日期区间的开始日为第一优先级,结束日为第二优先级进行排序 代码 我当时写的代码如下: List> dateIntervals = new ...
最新文章
- Redis 读写分离技术架构解析
- 数据库学习day_01:SQL的发展和数据库操作相关sql语句
- Jenkins部署Windows UI自动化的调度权限问题
- asp.net性能的技巧
- 【独立游戏】黎明之刃——3D硬核ARPG游戏
- linux 解压所有以zip结尾的文件_在 Linux 上压缩文件:zip 命令的各种变体及用法...
- Java-代理模式的理解
- twitter mysql_twitter-mysql改进点
- VMware创建Ubuntu操作系统到网络配置详细流程
- android开发模板web,Android开发实践:Android.mk模板
- [Xilinx]Xilinx ISE14.2中调用文本编辑器NotePad++设置方法
- Burpsuite Professional安装及使用教程(抓包)
- VS2019插件VSIX开发
- layer.open(常用)
- NTFS文件系统详解(二)之MBR(EBR)基本信息
- 面对复杂问题时,系统思考助你理解问题本质
- android 动态、静态壁纸实现
- 用Python代码来下载任意指定网易云歌曲
- 高中生参加的计算机奥赛是,电脑奥赛中最寂寥的竞赛 5学生夺牌直通清华
- 瓶子机器人diy制作大全_塑料瓶回收改造成电动机器人玩具