从零学Java 泛型

2024-01-11 23:04
文章标签 java 泛型 零学

本文主要是介绍从零学Java 泛型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Java 泛型

文章目录

  • Java 泛型
    • 1 什么是泛型?
    • 2 泛型类
    • 3 泛型接口
    • 4 泛型方法
    • 5 泛型集合
  • Collection 工具类

1 什么是泛型?

Java泛型是JDK1.5中引入的一个新特性,其本质是参数化类型,把类型作为参数传递。

常见形式有泛型类、泛型接口、泛型方法。

语法 :

  • <T,…> :T称为类型占位符,表示一种引用数据类型(一般使用一个大写字母表示)。
  • 多个占位符之间使用逗号隔开。

好处:

  • 提高代码的重用性
  • 防止类型转换异常, 提高代码的安全性

2 泛型类

泛型类: 在类名的后面加上 <> 尖括号, 尖括号中写上类型占位符

eg:

Student<T>

public class Student<T> {String name;int age;//泛型声明成员变量T t;//泛型作为方法的参数和返回值public T sayHi (T t) {System.out.println("姓名: "+this.name+"年龄: "+this.age);return t;}
}

Test:

public class Test {public static void main(String[] args) {Student<String> zhangsan = new Student<>();zhangsan.t = "hello";String s = zhangsan.sayHi("hello");System.out.println(s);System.out.println("-----------");Student<Integer> lisi = new Student<>();lisi.t = 200;Integer r = lisi.sayHi(200);System.out.println(r);}
}

3 泛型接口

泛型接口: 在接口后面加上<> , 尖括号中写上类型占位符

eg:

Usb<T>

public interface Usb<T> {//接口中不能用泛型声明静态常量//T t;//泛型作为抽象方法的参数和返回值T service(T t);
}

Upan Usb<String>

public class Upan implements Usb<String> {@Overridepublic String service(String s) {return s;}
}

Mouse<E> Usb<E>

public class Mouse<E> implements Usb<E> {@Overridepublic E service(E e) {return e;}
}

Test:

public class TestUsb {public static void main(String[] args) {Usb<String> usb = new Upan();String s = usb.service("hello");System.out.println(s);Usb<String> usb2 = new Mouse<String>();String s2 = usb2.service("XXXX");System.out.println(s2);Usb<Integer> usb3 = new Mouse<Integer>();Integer r = usb3.service(100);System.out.println(r);}
}

4 泛型方法

泛型方法: 在方法返回值类型的前面加上 <> 尖括号, 尖括号中写上类型占位符

eg:

Teach<T>

public class Teacher {String name;//上课//泛型方法: 在方法返回值类型的前面加上 `<>` 尖括号, 尖括号中写上类型占位符//泛型作为方法的参数或返回值public <T> T teach(T t) {//声明局部变量T t2 = t;return t2;}//在类中不能使用泛型声明参数个数相同的重载方法。public <K,E> E teach(E e, K k) {//声明局部变量E e1 = e;return e;}
}

TestTeach:

public class TestTeach {public static void main(String[] args) {Teacher teacher = new Teacher();teacher.teach("XXXX");teacher.teach(1000);teacher.teach(true);teacher.teach(Math.PI);}
}

注意事项

泛型不能在类中声明静态属性。

  • static修饰的属性是静态属性先于对象,泛型类型取决于创建对象时传入的实际类型。

泛型不能在类中初始化对象或数组,但是可以声明引用或数组。

  • 实例化对象需要分配空间,没有确定类型不能开辟空间。
  • 初始化数组时需要给元素进行分配空间,泛型类型不确定无法分配空间。

在类中不能使用泛型声明参数个数相同的重载方法。

使用不同实际类型创建出的泛型类对象的引用不可以相互赋值。

5 泛型集合

概念:参数化类型、类型安全的集合,强制集合元素的类型必须一致。

特点

  • 编译时即可检查,而非运行时抛出异常。
  • 访问时,不必类型转换。

eg:

TestArrayList :

public class TestArrayList {public static void main(String[] args) {//创建集合//ArrayList list = new ArrayList();ArrayList<String> list = new ArrayList<>();//1 添加list.add("北京");list.add("上海");list.add("广州");//2 遍历//增强forfor (String s : list) {System.out.println(s);}//普通forfor (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}//迭代器Iterator<String> it = list.iterator();while (it.hasNext()) {System.out.println(it.next());}//列表迭代器ListIterator<String> lit = list.listIterator();while (lit.hasNext()) {System.out.println(lit.nextIndex()+"..."+lit.next());}while (lit.hasPrevious()) {System.out.println(lit.previousIndex()+"..."+lit.previous());}}
}

eg : 泛型通配符 ?

public class Demo01 {public static void main(String[] args) {ArrayList<String> list = new  ArrayList<>();list.add("aaa");																																list.add("bbb");printList(list);ArrayList<Integer> list1 = new ArrayList<>();list1.add(111);list1.add(222);printList(list1);}//方法1: 使用泛型方法/*public static <T> void printList(ArrayList<T> list) {for (Object o : list) {System.out.println(o);}}*///方法2: 使用泛型通配符 ? 表示任何类型/*泛型通配符的限制1 泛型上限: ? extends Student   ?只能是Student类型或Student的子类2 泛型下限: ? super Student     ?只能是Student类型或Student的父类*/public static void printList(ArrayList<?> list) {for (Object o : list) {System.out.println(o);}}
}

Collection 工具类

概念:集合工具类,定义了除了存取以外的集合常用方法。

常用方法:

eg:

public class TestCollection {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(10);list.add(8);list.add(20);list.add(12);list.add(3);list.add(3);list.add(3);list.add(3);//1 sort(); 排序Collections.sort(list);System.out.println("排序之后: "+list);//2 binarySearch(); 二分查找int pos = Collections.binarySearch(list, 5);System.out.println(pos);//3 copy(); 复制List<Integer> list2 = new ArrayList<>();for (int i = 0; i < list.size(); i++) {list2.add(0);}Collections.copy(list2,list);System.out.println(list2);//4 frequency(); 获取元素出现的次数int count = Collections.frequency(list, 3);System.out.println(count);//5 reverse(); 反转Collections.reverse(list);System.out.println(list);//6 shuffle(); 打乱元素Collections.shuffle(list);System.out.println("打乱之后: "+list);}
}

这篇关于从零学Java 泛型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/595989

相关文章

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

Spring Boot项目打包和运行的操作方法

《SpringBoot项目打包和运行的操作方法》SpringBoot应用内嵌了Web服务器,所以基于SpringBoot开发的web应用也可以独立运行,无须部署到其他Web服务器中,下面以打包dem... 目录一、打包为JAR包并运行1.打包为可执行的 JAR 包2.运行 JAR 包二、打包为WAR包并运行

Java进行日期解析与格式化的实现代码

《Java进行日期解析与格式化的实现代码》使用Java搭配ApacheCommonsLang3和Natty库,可以实现灵活高效的日期解析与格式化,本文将通过相关示例为大家讲讲具体的实践操作,需要的可以... 目录一、背景二、依赖介绍1. Apache Commons Lang32. Natty三、核心实现代

Spring Boot 常用注解整理(最全收藏版)

《SpringBoot常用注解整理(最全收藏版)》本文系统整理了常用的Spring/SpringBoot注解,按照功能分类进行介绍,每个注解都会涵盖其含义、提供来源、应用场景以及代码示例,帮助开发... 目录Spring & Spring Boot 常用注解整理一、Spring Boot 核心注解二、Spr

SpringBoot实现接口数据加解密的三种实战方案

《SpringBoot实现接口数据加解密的三种实战方案》在金融支付、用户隐私信息传输等场景中,接口数据若以明文传输,极易被中间人攻击窃取,SpringBoot提供了多种优雅的加解密实现方案,本文将从原... 目录一、为什么需要接口数据加解密?二、核心加解密算法选择1. 对称加密(AES)2. 非对称加密(R

详解如何在SpringBoot控制器中处理用户数据

《详解如何在SpringBoot控制器中处理用户数据》在SpringBoot应用开发中,控制器(Controller)扮演着至关重要的角色,它负责接收用户请求、处理数据并返回响应,本文将深入浅出地讲解... 目录一、获取请求参数1.1 获取查询参数1.2 获取路径参数二、处理表单提交2.1 处理表单数据三、

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据

如何合理管控Java语言的异常

《如何合理管控Java语言的异常》:本文主要介绍如何合理管控Java语言的异常问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、Thorwable类3、Error4、Exception类4.1、检查异常4.2、运行时异常5、处理方式5.1. 捕获异常

Spring Boot集成SLF4j从基础到高级实践(最新推荐)

《SpringBoot集成SLF4j从基础到高级实践(最新推荐)》SLF4j(SimpleLoggingFacadeforJava)是一个日志门面(Facade),不是具体的日志实现,这篇文章主要介... 目录一、日志框架概述与SLF4j简介1.1 为什么需要日志框架1.2 主流日志框架对比1.3 SLF4

Spring Boot集成Logback终极指南之从基础到高级配置实战指南

《SpringBoot集成Logback终极指南之从基础到高级配置实战指南》Logback是一个可靠、通用且快速的Java日志框架,作为Log4j的继承者,由Log4j创始人设计,:本文主要介绍... 目录一、Logback简介与Spring Boot集成基础1.1 Logback是什么?1.2 Sprin