根据b站韩顺平教育韩顺平教育java教学视频学习的学习笔记。个人学习理解,如有疏漏,敬请改正。

泛型

泛型定义

泛型:一个标识数据类型的数据类型

泛型又称参数化类型,是Jdk5.0出现的新特性,解决数据类型的安全性问题

在类声明或实例化时只要指定好需要的具体的类型即可

Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生类型应用异常,同时代码更加简洁、健壮

泛型的作用是:可以在类声明时通过一个标识标识类中某个属性的类型,或者是某个方法的返回值的类型,或者是参数类型。

 public static void main(String[] args) {//泛型演示Person<Integer> person = new Person<>(100);System.out.println(person.age);System.out.println(person.getAge());System.out.println(person.show());Person<String> person1 = new Person<String>("100");System.out.println(person.age);System.out.println(person.getAge());System.out.println(person.show());}
}//泛型的作用是:可以在类声明时通过一个标识标识类中某个属性的类型,或者是某个方法的返回值的类型,或者是参数类型。
class  Person<E>{E age;//E标识age的数据类型,该数据类型在定义Person对象的时候指定,即在编译期间就能确定E是什么类型public Person(E age) {//E可以用于参数类型this.age = age;}public E getAge() {//E可以用于返回类型return age;}public E show(){System.out.println(age.getClass());return age;}
}

泛型的声明

interface接口<T>和class类<K,V>{}比如List,ArrayList

说明:

其中的T,K,V不代表值而是表示类型

任意字母都可以。常用T表示,是Type的缩写

泛型的实例化

Person<Integer> person = new Person<>(100);

泛型使用细节

Interface List<T>{},public class HashSet<E>{}等等

说明:T、E只能是应用类型(即int、double等基本数据类型要装箱为其对应的包装类Integer和Double等)

在给泛型指定具体类型后,可以传入该类型或其子类类型

如果将<>删除,默认给它的泛型是[<E>  E就是Object],即

Person person = new Person(100);

等价与如下

Person<Object> person = new Person<>(100);

        HashSet<Student> students = new HashSet<>();students.add(new Student("Tom",19));students.add(new Student("Maddox",18));students.add(new Student("Marry",17));for (Student student : students){System.out.println(student);}HashMap<String, Student> studentHashMap = new HashMap<>();studentHashMap.put("Smith",new Student("Smith",16));studentHashMap.put("Jack",new Student("Jack",20));Set<Map.Entry<String, Student>> entries = studentHashMap.entrySet();Iterator<Map.Entry<String, Student>> iterator = entries.iterator();while (iterator.hasNext()) {Map.Entry<String, Student> studentEntry =  iterator.next();System.out.println(studentEntry.getKey() + "-" + studentEntry.getValue().getName());}}

自定义泛型类

class 类名<T,R,...>{//...表示可以为多个

成员

}

注意细节

1.普通成员可以使用泛型(属性、方法)

2.使用泛型的数组,不能初始化

3.静态方法中不能使用类的泛型

4.泛型类的类型,是在创建对象时确定的(因为创建对象时,需要指定确定类型)

5.如果在创建对象时,没有指定类型,默认为Object

//Tiger后面是泛型,所以将Tiger成为泛型类
//普通成员可以使用泛型(属性、方法)
//使用泛型的数组,不能初始化
//静态方法中不能使用类的泛型
class Tiger<T,R,M>{//T,R,M称为泛型标识符,可以有多个,一般是单个大写字母String name;T t;R r;M m;//使用泛型的数组,不能初始化,因为在创建数组对象时,不能确定T的类型,就无法在内存开辟空间T[] n = new T[8];//有错误public Tiger(String name, T t, R r, M m) {this.name = name;this.t = t;this.r = r;this.m = m;}//泛型类不能用于使用static修饰的属性、方法内//因为静态是和类相关的,在类加载时,对象还没有创建//所以,静态方法和静态属性使用了泛型类,JVM就无法完成初始化static M m1;public static void f(R r){System.out.println("泛型类不能用于使用static修饰的属性、方法内");}}

自定义泛型接口

Interface 接口名<T,R...>{
}

注意细节

1.接口中,静态成员也不能使用泛型(与泛型类一致)

2.泛型接口的类型,在继承接口或实现接口时确定

3.没有指定类型,默认为Object

  • 接口中的成员都是静态的

4.在继承接口时指定泛型接口的类型

5.当我们去实现接口时,因为子接口在继承父接口时指定了泛型标识符的数据类型,在实现父接口的方法时,就会用指定的数据类型来代替原来的泛型标识符

interface Usb<U,S> {int n = 10;U get(U u);void hi(S s);void run(U u, S s);//在jdk8中使用默认方法,泛型也可以使用default S method(U u){return null;}
}//在继承接口时指定泛型接口的类型
interface A extends Usb<String,Double>{}//当我们去实现接口时,因为子接口在继承父接口时指定了泛型标识符的数据类型,
// 在实现父接口的方法时,就会用指定的数据类型来代替原来的泛型标识符
class AA implements A{@Overridepublic String get(String s) {return null;}@Overridepublic void hi(Double aDouble) {}@Overridepublic void run(String s, Double aDouble) {}
}//直接实现父接口
//与上面AA实现子接口一致
class B implements Usb<Integer,Float>{@Overridepublic Integer get(Integer integer) {return null;}@Overridepublic void hi(Float aFloat) {}@Overridepublic void run(Integer integer, Float aFloat) {}
}

自定义泛型方法

基本语法

修饰符<T,R,...>返回类型 方法名(参数列表){

}

注意细节

1.泛型方法,可以定义在普通类中,也可以定义在泛型类中

2.当泛型方法被调用时,类型会确定

3.public void eat(E e){},修饰符后没有<T,R,..>eat()方法不是泛型方法,而是参数使用了泛型

4.泛型方法可以使用类声明的泛型,也可以使用自己声明的泛型

public class GenericInterforceDis {public static void main(String[] args) {Car car = new Car();
//        当泛型方法被调用时,类型会确定car.run("奥迪",100);}
}//泛型方法,可以定义在普通类中,也可以定义在泛型类中
class Car{//普通类public void  fly(){//普通方法}//泛型方法可以使用类声明的泛型,也可以使用自己声明的泛型public <T,E> void run(T t,E e){//泛型方法}
}class Fish<T,E>{//泛型类T t;E e;public Fish(T t, E e) {this.t = t;this.e = e;}//泛型方法可以使用类声明的泛型,也可以使用自己声明的泛型public <R,S> R swim(R r,T t){return r;}
}

泛型的继承和通配符说明

  1. 泛型不具备继承性
  2. <?>:支持任意泛型类型
  3. <? extends A>:支持A类以及A类的子类,规定了泛型的上限
  4. <? super A>:支持A类以及A类的父类,不限于直接父类,规定了泛型的下限

JUnit测试类的使用

需求:

  1. 一个类有很多功能代码需要测试,为了测试,就需要写入到main方法中
  2. 如果有多个功能代码测试,就需要来回注销,切换很麻烦
  3. 如果可以直接运行一个方法就方便很多,并且可以给出相关信息

JUnit是一个Java语言的单元测试框架

多数Java的开发环境都已经集成了JUnit作为单元测试的工具

@Test  使用JUnit5.4版本

泛型(Generic)理解相关推荐

  1. 泛型方法的定义和使用_泛型( Generic )

    泛型(Generic) 1. 泛型概述 泛型是一个未知的, 不确定的数据类型. 比如ArrayList 中的E, 就是一个未知的不确定的数据类型, 那么他就是一个泛型 泛型虽然是一个未知的, 不确定的 ...

  2. 你真的了解泛型 Generic 嘛?

    泛型 Generic Programming[1] 通常指允许程序员在强类型程序设计语言中,编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型,即类型参数化 首先我们不是科班讨论学术, ...

  3. Java - 泛型 ( Generic )

    Java - 泛型 ( Generic ) > 泛型的特点 > 解决元素存储的安全性问题 > 解决获取数据元素时,需要类型强转的问题 > 不能在 static 方法中使用泛型, ...

  4. DotNET:LINQ对泛型(Generic)操作和泛型方法及属性

    ylbtech-DotNET:泛型(Generic)和LINQ操作 1,遍历泛型集合 2,根据索引位置移除项(RemoveAt()) 3,查询一个人(Single()) 3.2,查询一个人(Singl ...

  5. 泛型(generic)概述和基本使用

    泛型(generic)概述和基本使用 A:泛型概述 集合边上有一个尖括号,尖括号指的就是泛型. 限定集合存储的数据类型,如果加上这个引用数据类型, 就告诉你这个集合只能存储该类型对象和该类型的子类对象 ...

  6. java泛型(Generic)超详细

    目录 1.为什么要有泛型(Generic)? 2.泛型的设计背景 2.1那么为什么要有泛型呢,直接Object不是也可以存储数据吗? 3.在集合中使用泛型 4.自定义泛型结构 4.1自定义泛型结构:泛 ...

  7. Java泛型(1)--集合使用泛型Generic、自定义泛型、泛型在继承上的体现、通配符的使用

    文章目录 泛型的概念 集合中使用泛型 自定义泛型结构 泛型在继承上的体现 通配符的使用 泛型的概念 集合容器类在设计阶段/声明阶段不能确定这个容器实际存的是什么类型的对象,所以在JDK1.5之前只能把 ...

  8. java相关求助---Java泛型的理解与等价实现---------没有完全明白啊...请大神指导...

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

  9. Java程序低手之关于泛型(Generic)

    虽然一直以来,Java都提供了强制类型转换,但是那确实是Java的弱点,因为你是在取数据的时候才保证了类型安全(Type-safe),而不是在存储数据的时候就做好这项工作,Java5提供了Generi ...

  10. Java学习打卡第七天——[再谈Collection之Set,TreeSet,泛型Generic的简介和使用]

    说明:为了文章的简洁性和方便阅读在以后的打卡过程中,我会给出核心代码 Javaee之[Collection之Set] Javaee之[Collection之TreeSet] Javaee之[Colle ...

最新文章

  1. excel生成sql
  2. 大数据python试卷_大数据起步--Python语言-中国大学mooc-试题题目及答案
  3. 大数据对六大领域的挑战
  4. 贪心算法 -- 最小延迟调度
  5. 停牌17个月 汉能薄膜真的要复牌了?
  6. SpringBoot2.0 基础案例(03):配置系统全局异常映射处理
  7. 机器学习集成模型学习——Stacking集成学习(五)
  8. mysql workbench查询快捷_mysql workbench快捷键
  9. Linux内核源代码分析——中断(一鞭一条痕)(上)
  10. bzoj 2957: 楼房重建(线段树+递归)
  11. Day06,selenium的剩余用法、万能登录破解和爬取京东商品信息,及破解极验滑动验证码...
  12. Cisco-NetDevOps-CI/CD-Experiment Workflow
  13. 设备树解析过程及platform设备注册
  14. JAVA博客和书籍推荐
  15. 斯坦福NLP名课带学详解 | CS224n 第14讲 - Transformers自注意力与生成模型(NLP通关指南·完结)
  16. 四百左右的蓝牙耳机有哪些?四百左右好用的蓝牙耳机推荐
  17. 【漏洞学习——SQL】华图教育某分站SQL注入漏洞
  18. vue打印插件,使用教程
  19. 经典算法之,细化时间颗粒度24*7细化为48*7颗粒度
  20. Good Bye 2022: 2023 is NEAR 题解

热门文章

  1. JAVA 计算当月有多少天
  2. moment 一个月有多少天
  3. 新玺配资:上证指数再创新低 还有机会吗?
  4. 中国大陆18位身份证校验算法(附JS实现)
  5. MFC专业扩展库BCGControlBar:使用方法入门
  6. 【转载】主流硬盘接口SATA、mSATA、PCIE等差异比较
  7. vue移动端车牌号输入键盘组件封装(支持新能源车牌和uniapp)
  8. 按钮组(Button group)
  9. 测试驱动开发实践1————项目代码生成
  10. 4014基于邻接表的长度为k的简单路径的求解