Java开发——23.泛型

简介: 泛型的通配符/定义格式。

我们查看API帮助文档可知,Collection接口的定义格式为Interface Collection<E>,那么<E>代表什么呢?E - 此集合中元素的类型 !为什么要用<>括起来呢?就是我们将要学习到的泛型。


学习思路:

image.png


泛型的通配符:

泛型中的通配符有四种:T、E、K V、?


泛型有以上四种定义格式;

T Java的类型的是一个形参!在方法声明的时候使用。一般指代泛型类


E  通常用于规定集合中的元素类型。


K V  般表示Java中Map集合的键值对。


一般表示不确定的Java类型,这是一种无限的符号,代表任何类型都可以。是一个实参!在方法使用的时候直接调用,但是 ?不能作为元素类型添加值,也就是 ?只能在没有定义元素类型的时候接收不同类型的元素。

?一般只是接收某种数据类型,并不能作为返回值;

?extends XX:向下限定,E及其子类;

? super XX:向上限定,E极其父类。

(在后面详细讲解 ?请继续学习。)


在学习Collection集合的时候,我们了解到,集合可以存储任意类型的元素,那么我们如果在使用增强for循环遍历集合的过程中,不使用Object接收对象,而使用特定的元素类型,就会爆出ClassCastException异常,表示类型转换异常,类型不兼容


publicstaticvoidmain(String[] args) {
//此处指定了Collection集合的类型为Integer,所以不能添加别的元素类型Collection<Integer>num=newArrayList();
num.add(123);
num.add(456);
num.add(789);
// num.add("123");在编译的时候都会报错//我们定义了一个没有指定类型的Collection集合Collectionstr=newArrayList();
str.add("123");
str.add("456");
str.add("789");
//因为指定集合的元素类型<E>,只会在编译的时期判断,存入的内容类型//在运行时会把元素类型都默认为Object类型,这就叫做“泛型的擦除”num.addAll(str);
//在增强for循环的时候我们使用了Integer作为元素输出类型//但是num集合中是存在String类型的元素的,所以会存在类型不兼容无法完成遍历for (Integerin : num){
System.out.println(in);
        }
}

image.png



泛型,用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数进行传递。


泛型类:

<数据类型> 此处的数据类型只能是引用类型

好处:

A:把运行时期的问题提前到了编译期间 ;

B:避免了强制类型转换。


/** 泛型类:把泛型定义在类上*/publicclassObjectTool<T> {
privateTobj;
publicTgetObj() {
returnobj;
    }
publicvoidsetObj(Tobj) {
this.obj=obj;
    }
}


/** 泛型类的测试*/publicclassObjectToolDemo {
publicstaticvoidmain(String[] args) {
ObjectTool<String>ot=newObjectTool<String>();//规范了数据的存储ot.setObj(newString("江一燕"));
Strings=ot.getObj();
System.out.println("姓名是:"+s);
ObjectTool<Integer>ot2=newObjectTool<Integer>();
ot2.setObj(27);
Integeri=ot2.getObj();
System.out.println("年龄是:"+i);
    }
}


泛型方法:

修饰符 <代表泛型的变量>  返回值类型  方法名 (参数){  }


//普通方法//修饰符 返回值类型 方法名(参数){}publicintshow(inti){
returni;
    }
/** 泛型方法:把泛型定义在方法上*/public<T>Objectshow(Tt) {
returnt;
    }
//定义一个泛型方法//返回类型不应该明确,因为泛型方法的类型都不明确//建议:Object 或者  T(泛型)public<T>Tshow(Tt){
returnt;
    }



//实现类publicclassTestCollection {
public<T>Objectshow(Tt){
returnt;
    }
public<T>Tshow2(Tt){
returnt;
    }
publicintshow(inti){
returni;
    }
publicstaticvoidmain(String[] args) {
System.out.println(newTestCollection().show(1111111111));
System.out.println(newTestCollection().show("2222222222"));
System.out.println(newTestCollection().show2(newDate()));
    }
}
/*11111111112222222222Tue May 03 16:03:35 CST 2022*/


泛型接口:

修饰符 interface 接口名<代表泛型的变量> {  }


/** 泛型接口:把泛型定义在接口上*/publicinterfaceInter<T> {
publicabstractvoidshow(Tt);
}



//实现类在实现接口的时候//第一种情况:已经知道该是什么类型的了publicclassInterImplimplementsInter<String> {
@Overridepublicvoidshow(Stringt) {
System.out.println(t);
  }
}
//第二种情况:还不知道是什么类型的publicclassInterImpl<T>implementsInter<T> {
@Overridepublicvoidshow(Tt) {
System.out.println(t);
  }
}


//测试类publicstaticvoidmain(String[] args) {
//第一种情况:实现类已经明确类型,实例化对象时必须与实现类中的类型一致InterDemo<String>i=newInteImpl();//我在实现的时候,已经明确类型--Stringi.show("aaa");
i.show("bbb");
//第二种情况:实现类也没有明确类型InterDemo<Integer>ii=newInteImpl2<>();//我在实现的时间也没有给出明确ii.show(11);
ii.show(22);
InterDemo<String>ii2=newInteImpl2<>();//我在实现的时间也没有给出明确ii2.show("11");
ii2.show("22");
    }
}


当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。


关于 ?通配符:

泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。此时只能接受数据,不能往该集合中存储数据



/** 泛型高级(通配符)* ?:任意类型,如果没有明确,那么就是Object以及任意的Java类了* ? extends E:向下限定,E及其子类* ? super E:向上限定,E极其父类*/publicclassAnimal {
}
publicclassDogextendsAnimal {
}
publicclassCatextendsAnimal {
}
publicclassGenericDemo {
publicstaticvoidmain(String[] args) {
// 泛型如果明确的写的时候,前后必须一致Collection<Object>c1=newArrayList<Object>();
//错误写法:// Collection<Object> c2 = new ArrayList<Animal>();// Collection<Object> c3 = new ArrayList<Dog>();// Collection<Object> c4 = new ArrayList<Cat>();// ?表示任意的类型都是可以的Collection<?>c5=newArrayList<Object>();
Collection<?>c6=newArrayList<Animal>();
Collection<?>c7=newArrayList<Dog>();
Collection<?>c8=newArrayList<Cat>();
// ? extends E:向下限定,E及其子类,表示包括E在内的任何子类;// Collection<? extends Animal> c9 = new ArrayList<Object>();Collection<?extendsAnimal>c10=newArrayList<Animal>();
Collection<?extendsAnimal>c11=newArrayList<Dog>();
Collection<?extendsAnimal>c12=newArrayList<Cat>();
// ? super E:向上限定,E极其父类,表示包括E在内的任何父类;Collection<?superAnimal>c13=newArrayList<Object>();
Collection<?superAnimal>c14=newArrayList<Animal>();
// Collection<? super Animal> c15 = new ArrayList<Dog>();// Collection<? super Animal> c16 = new ArrayList<Cat>();  }
}


相关文章
|
1天前
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
14 4
|
11天前
|
开发框架 JavaScript 前端开发
HarmonyOS UI开发:掌握ArkUI(包括Java UI和JS UI)进行界面开发
【10月更文挑战第22天】随着科技发展,操作系统呈现多元化趋势。华为推出的HarmonyOS以其全场景、多设备特性备受关注。本文介绍HarmonyOS的UI开发框架ArkUI,探讨Java UI和JS UI两种开发方式。Java UI适合复杂界面开发,性能较高;JS UI适合快速开发简单界面,跨平台性好。掌握ArkUI可高效打造符合用户需求的界面。
54 8
|
6天前
|
SQL Java 程序员
倍增 Java 程序员的开发效率
应用计算困境:Java 作为主流开发语言,在数据处理方面存在复杂度高的问题,而 SQL 虽然简洁但受限于数据库架构。SPL(Structured Process Language)是一种纯 Java 开发的数据处理语言,结合了 Java 的架构灵活性和 SQL 的简洁性。SPL 提供简洁的语法、完善的计算能力、高效的 IDE、大数据支持、与 Java 应用无缝集成以及开放性和热切换特性,能够大幅提升开发效率和性能。
|
7天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
20 2
|
7天前
|
监控 Java 数据库连接
在Java开发中,数据库连接管理是关键问题之一
在Java开发中,数据库连接管理是关键问题之一。本文介绍了连接池技术如何通过预创建和管理数据库连接,提高数据库操作的性能和稳定性,减少资源消耗,并简化连接管理。通过示例代码展示了HikariCP连接池的实际应用。
13 1
|
15天前
|
Java 大数据 API
别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!
分享Java Stream API的常用方法,让开发更简单。涵盖filter、map、sorted等操作,提高代码效率与可读性。关注公众号,了解更多技术内容。
|
12天前
|
Java API
[Java]泛型
本文详细介绍了Java泛型的相关概念和使用方法,包括类型判断、继承泛型类或实现泛型接口、泛型通配符、泛型方法、泛型上下边界、静态方法中使用泛型等内容。作者通过多个示例和测试代码,深入浅出地解释了泛型的原理和应用场景,帮助读者更好地理解和掌握Java泛型的使用技巧。文章还探讨了一些常见的疑惑和误区,如泛型擦除和基本数据类型数组的使用限制。最后,作者强调了泛型在实际开发中的重要性和应用价值。
12 0
[Java]泛型
|
18天前
|
Java 关系型数据库 API
介绍一款Java开发的企业接口管理系统和开放平台
YesApi接口管理平台Java版,基于Spring Boot、Vue.js等技术,提供API接口的快速研发、管理、开放及收费等功能,支持多数据库、Docker部署,适用于企业级PaaS和SaaS平台的二次开发与搭建。
|
1天前
|
Java API Android开发
kotlin和java开发优缺点
kotlin和java开发优缺点
WK
|
6天前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
16 0