JAVA泛型的使用(超详细)

news/2024/11/7 8:32:01/

目录

1、概念

2、优点

3、泛型使用实例

4、泛型使用细节

5、自定义泛型类

6、自定义泛型接口

7、自定义泛型方法


1、概念

        Java泛型是JDK1.5中引⼊的⼀个新特性,其本质是参数化类型,把类型作为参数传递。 常⻅形式有泛型类、泛型接⼝、泛型⽅法。

2、优点

        1)编译时,检查添加元素的类型,提高了安全性

        2)减少了类型转换次数,提高了效率

public class Test {public static void main(String[] args) {ArrayList<Dog> arrayList = new ArrayList<>();arrayList.add(new Dog("贝贝",5));arrayList.add(new Dog("乐乐",3));arrayList.add(new Dog("小黑",4));//arrayList.add(new Cat("贝贝",5));   错误for (Dog dog : arrayList) {System.out.println(dog.getName()+"-"+dog.getAge());}}
}

3、泛型使用实例

public class Test {public static void main(String[] args) {HashSet<Student> hashSet = new HashSet<>();hashSet.add(new Student("张三",22));hashSet.add(new Student("李四",23));hashSet.add(new Student("王五",24));
​//遍历for (Student student : hashSet) {System.out.println(student);}//使用泛型方式给HashMap放入三个学生对象HashMap<String, Student> hashMap = new HashMap<>();hashMap.put("Tom",new Student("Tom",22));hashMap.put("Jack",new Student("Jack",23));hashMap.put("Smith",new Student("Smith",24));
​//迭代器 entrySetSet<Map.Entry<String, Student>> entrySet = hashMap.entrySet();Iterator<Map.Entry<String, Student>> iterator = entrySet.iterator();System.out.println("===========================");while (iterator.hasNext()) {Map.Entry<String, Student> next = iterator.next();System.out.println(next.getKey()+"-"+next.getValue());}}
}

4、泛型使用细节

        1)interface List<T>{},public class HashSet<E>{}...等等

                T、E只能是引用类型

ArrayList<Integer> list1 = new ArrayList<>(); //正确
ArrayList<int> list2 = new ArrayList<int>();  //错误

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

public class Demo03 {public static void main(String[] args) {//因为E制定了A类型,构造器传入了new A//在给泛型指定具体类型后,可以传入该类型或者其子类类型Pig<A> pig = new Pig<A>(new A());Pig<A> pig1 = new Pig<A>(new B());}
}
class A{}
class B extends A{}
​
class Pig<E>{E e;public Pig(E e) {this.e = e;}
}

        3)在实际开发中,我们往往简写

ArrayList<Integer> list = new ArrayList<Integer>();
//简写
ArrayList<Integer> list1 = new ArrayList<>();

5、自定义泛型类

        注意细节:

                1)普通成员可以使用泛型

public class AA<T,R> {T t;R r;
}

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

public class AA<T,R> {T t;R r;T[] ts;//T[] ts =new T[4];  不能初始化
}

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

//因为静态时和类相关,在类加载时,对象还没创建,所以静态属性和静态方法使用了泛型,JVM就无法完成初始化
//    static R r2;
//    public static void m(T t){}

                4)泛型类的类型是在创建对象时确定的

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

6、自定义泛型接口

        注意细节:

                1)接口中,静态成员也不能使用泛型

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

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

public interface IUsb<U,R> {int n=10;//U name;   不能这样使用,静态成员不能使用泛型//普通方法,可以使用接口泛型U get(U u);void hi(R r);void run(R r1,R r2,U u1,U u2);//在JDK8中,可以在接口中,使用默认方法,也是可以使用泛型default R method(U u){return null;}
}
public interface IA extends IUsb<String, Double> {
}
public class AA implements IA {//当我们去实现IA接口时,因为IA在继承IUsb接口时,制定了U为String,R为Double//在实现IUsb接口的方法时,使用String替换U,Double替换R@Overridepublic String get(String s) {return null;}
​@Overridepublic void hi(Double aDouble) {
​}
​@Overridepublic void run(Double r1, Double r2, String u1, String u2) {
​}
}

7、自定义泛型方法

        注意细节:

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

class Car{//普通类public void run(){//普通方法
​}public<T,R> void fly(T t,R r){//泛型方法
​}
}
class fish<T,R>{//泛型类public void run(){
​}public <U,M>void eat(U u, M m){
​}
}

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

public class Test {public static void main(String[] args) {Car car = new Car();//当调用方法时,传入参数,编译器就会确定类型car.fly("宝马",100);}
}

        3) public void swim(T t){}不是泛型方法,而是使用了类声明的泛型。


http://www.ppmy.cn/news/64169.html

相关文章

什么样的蓝牙耳机佩戴舒适?蓝牙耳机佩戴舒适度排名

越来越多的人开始使用运动蓝牙耳机了&#xff0c;不仅仅是因为蓝牙耳机的它无耳机线的束缚&#xff0c;日常还很便携&#xff0c;市面上的蓝牙耳机质量参差不齐&#xff0c;有些佩戴舒适度也比较差&#xff0c;下面整理了几款评分还不错的几款蓝牙耳机。 一、南卡小音舱Lite2蓝…

Shell数组

目录 数组定义方法 数组包括的数据类型 获取数组长度 判断是否缺少元素 快速定义数组 数组遍历​编辑​编辑 数组切片 数组替换​编辑 原数组替换​编辑 删除数组​编辑 追加元素 数组排序算法 冒泡排序 数组定义方法 方法一 数组名&#xff08;value0 value1 v…

#include<algorithm>接口

#include <algorithm> 是C中一个常用的预处理指令&#xff0c;它包含了algorithm库。这个库提供了大量用于操作序列&#xff08;例如数组、向量、列表等容器&#xff09;的通用算法&#xff0c;这些算法包括查找、排序、复制、移动、修改和其他操作。以下是algorithm库中…

铁路中的警冲标

1、警冲标的定义 警冲标是用来指示机车车辆停车时&#xff0c;不准向道岔方向或线路交叉点方向越过&#xff0c;以防止停留在该线上的机车车辆与邻线上的机车车辆发生侧面冲突的标志。另外&#xff0c;在出站道岔上&#xff0c;警冲标用来确定站界标位置。 2、警冲标怎么设置 …

ES6-Promise

一、概念 Promise 是 ES6 引入的异步编程的新解决方案。语法上 Promise 是一个构造函数&#xff0c; 用来封装异步操作并可以获取其成功或失败的结果。 1) Promise 构造函数 : Promise (excutor) {} 2) Promise.prototype.then 方法 3) Promise.prototype.catch 方…

JavaScript实现输入年龄来判断年龄阶段是青年/中年/老年人的代码

以下为实现输入年龄来判断年龄阶段是青年/中年/老年人的程序代码和运行截图 目录 前言 一、实现输入年龄来判断年龄阶段是青年/中年/老年人 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择&#xff0c;您可以在目录里进行快速查找…

MySQL---10、详细的数据类型

1、MySQL中的数据类型 类型类型举例整数类型TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT浮点类型FLOAT、DOUBLE定点数类型DECIMAL位类型BIT日期时间类型YEAR、TIME、DATE、DATETIME、TIMESTAMP文本字符串类型CHAR、VACHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT枚…

6 接口、多态、断言、项目【Go语言教程】

6 接口、多态、断言、项目【Go语言教程】 1 接口 1.1 概念 Golang 中 多态特性主要是通过接口来体现的。 interface 类型可以定义一组方法&#xff0c;但是这些不需要实现。并且 interface 不能包含任何变量。到某个自定义类型(比如结构体 Phone)要使用的时候,在根据具体情况…