Java高级 —— 泛型

2023-11-04

泛型概念

  • 问题引入:如果我们需要产生多个对象,每个对象的逻辑完全一样,只是对象内的成员啊变量的类型不同。那我们如何去做?两种解决办法:

在这里插入图片描述
方法一:

class Cls1
{
	int a;
	
	public Cls1(int a){//构造方法
		this.a = a;
	}
	
	public int getData(){
		return a;
	}
}

class Cls2
{
	String b;//仅仅类型不同 小数、浮点数... 类的膨胀,重用性差
	
	public Cls2(String b){//构造方法
		this.b = b;
	}
	
	public String getData(){
		return b;
	}
}

public class test {
	public static void main(String[] args) {
		Cls1 cls1 = new Cls1(10);
		System.out.println(cls1.getData());
		Cls2 cls2 = new Cls2("你好呀!");
		System.out.println(cls2.getData());
	}

}

方法二:

class Cls1
{
	Object a;//Object是所有数据类型的父类
	
	public Cls1(Object a){//构造方法
		this.a = a;
	}
	
	public Object getData(){
		return a;
	}
}


public class test {
	public static void main(String[] args) {
		Cls1 cls1 = new Cls1(10);         //1.5版本以下运行出错,询问回复int不是类,是数据类型,String是类
		System.out.println(cls1.getData());//Integer才是类
		Cls1 cls2 = new Cls1("你好呀!");
		System.out.println(cls2.getData());
		//System.out.println((int)cls2.getData());这样强制转换 编译通过但运行出错!ppt有讲
	}

}

这里可以使用泛型的解决方法:
创建工程时选择1.5版本JDK及以上

在这里插入图片描述

class Cls1<T>
{
	T a;//Object是所有数据类型的父类
	
	public Cls1(T a){//构造方法
		this.a = a;
	}
	
	public T getData(){
		return a;
	}
}



public class test {
	public static void main(String[] args) {
		Cls1<Integer> cls1 = new Cls1<Integer>(10);
		System.out.println(cls1.getData());
		Cls1<String> cls2 = new Cls1<String>("你好呀!");
		System.out.println(cls2.getData());
	}

}

泛型可设置多个类型参数

在这里插入图片描述
在这里插入图片描述

上述泛型类特点第二点的例子:

class Cls1<T>
{
	T a;
	
	public Cls1(T a){//构造方法
		this.a = a;
	}
	
	public T getData(){
		return a;
	}
}

class Cls2<T,T2>
{
	T a;
	T2 b;
	
	public Cls2(T a,T2 b){
		this.a = a;
		this.b = b;
	}
	
	public T getData(){
		return a;
	}
	public T2 getData2(){
		return b;
	}
}


public class test {
	public static void main(String[] args) {
		Cls1<Integer> cls1 = new Cls1<Integer>(10);
		System.out.println(cls1.getData());
		Cls1<String> cls2 = new Cls1<String>("你好呀!");
		System.out.println(cls2.getData());
		
		Cls2<Integer,String> cls3 = new Cls2<Integer,String>(100,"好热!");
		System.out.println(cls3.getData());
		System.out.println(cls3.getData2());
	}

}

运行结果:

10
你好呀!
100
好热!

泛型继承

abstract class Cls1<T>//抽象类不能实例化(不能new)
{
	T a;
	
	public Cls1(T a){//构造方法
		this.a = a;
	}
	
	public T getData(){
		return a;
	}
	abstract void printInfo();
}

class Cls2<T,T2> extends Cls1<T>
{
	T2 b;
	
	public Cls2(T a,T2 b){
		super(a);
		this.b = b;
	}
	
	public T2 getData2(){
		return b;
	}
	
	void printInfo(){
		System.out.println("输出");
	}
}


public class test {
	public static void main(String[] args) {
				
		Cls2<Integer,String> cls = new Cls2<Integer,String>(100,"好热!");//抽象类不能进行实例化(Cls1不能new)
		cls.printInfo();
	}

}

泛型接口

abstract class Cls1<T>//抽象类
{
	T a;
	
	public Cls1(T a){//构造方法
		this.a = a;
	}
	
	public T getData(){
		return a;
	}
	abstract void printInfo();
}

interface cls3<T>   //接口
{
	abstract void printInfoInCls3(T t);
}

class Cls2<T,T2> extends Cls1<T> implements cls3<T>
{
	T2 b;
	
	public Cls2(T a,T2 b){
		super(a);
		this.b = b;
	}
	
	public T2 getData2(){
		return b;
	}
	
	void printInfo(){
		System.out.println("输出");
	}

	public void printInfoInCls3(T t) {
		// TODO Auto-generated method stub
		System.out.println(t);
		
	}
}



public class test {
	public static void main(String[] args) {
				
		Cls2<Integer,String> cls = new Cls2<Integer,String>(100,"好热!");//抽象类不能进行初始化
		cls.printInfo();
		cls.printInfoInCls3(100);
		
	}

}

运行结果:

输出
100

限制泛型可用类型

在这里插入图片描述
默认使用:

abstract class Cls1<T extends Object>

实现某个接口:

interface move   //接口
{
	abstract void printInfoInCls3();
}

abstract class Cls1<T extends move>//不用implements
{
...
}

泛型通配声明

在这里插入图片描述

在这里插入图片描述

泛型方法

在这里插入图片描述
例子:

class B
{
	public <T> void printInfo(T t) {//泛型方法
		System.out.println(t);
	}
	
	public void print1(int a){//比方法重载高效
		System.out.println(a);
	}
	public void print1(char a){
		System.out.println(a);
	}
	public void print1(String a){
		System.out.println(a);
	}
}

public class test {
	public static void main(String[] args) {
		B b = new B();
		b.printInfo("哈哈");
		b.printInfo(1234);
		b.printInfo(0.5);
		b.printInfo('a');
	
	}

}

运行结果:

哈哈
1234
0.5
a

泛型方法限制泛型可用类型

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java高级 —— 泛型 的相关文章

随机推荐

  • Nacos配置中心一直连接本地问题&解决

    最近使用写了一个微服务的demo 使用nacos做配置中心 项目启动我的nacos一直去连接本地 配置文件中也指定了nacos的地址 后来 也是查阅资料才得知 bootstrap yml bootstrap properties 用来在程序
  • Vue解决CDN引入的echarts,通过ajax异步请求的数据不能被正确渲染到视图层的问题

    在参加计算机设计大赛做作品的时候遇到的一个困难 花了挺长时间才解决 在这里做个记录 一 这里先介绍如何CDN引入ECharts 在需要用到ECharts的界面加入 即可 或者先下载好这个文件 src改为这个文件的相对路径 二 以南丁格尔玫瑰
  • 数据结构与算法分析--Java语言描述(第二章(1))

    习题2 8 假设需要生成前N个自然数的一个随机置换 例如 4 1 2 5 2 和 3 1 4 2 5 就是合法的置换 但 5 4 1 2 1 却不是 因为数1出现了两次而数 3 缺没有 这个程序常常用于模拟一些算法 我们假设存在一个随机数生
  • 最快可达 SwinIR 4倍的高效超分网络

    本文首发于 我爱计算机视觉 如需转载等事宜请联系我爱计算机视觉 作者单位 香港理工大学 OPPO 论文链接 https arxiv org abs 2203 06697 代码链接 https github com xindongzhang
  • 如何用NPM删除node_modules文件夹

    大家在日常的开发中相必都遇到过如何快速方便的删除node modules文件夹的问题 很明显如果用常规方式会很费时费力 这里教给大家一种快捷的方式 通过npm命令来删除node modules文件夹 首先通过npm安装删除工具 npm in
  • 10行代码实现Java文件大小格式化,支持GB、TB到YB可再扩展

    话不多说 直接上代码 自己实现的 private static String fileSizeToText Long size Double unit 1024D sizeUnit unit String sizes B KB MB GB
  • 字符串匹配算法总结

    http blog csdn net WINCOL article details 4795369 KMP虽然经典 但是理解起来极其复杂 好不容易理解好了 便起码来巨麻烦 老子就是今天图书馆在写了几个小时才勉强写了一个有bug的 效率不高的
  • L2TP/IPSEC搭建详细步骤

    背景 长沙分公司访问北京总公司的办公OA业务 目前的方法是通过在北京总公司出口防火墙上配置OA业务的端口映射 然后在长沙分公司通过输入北京总部给的域名带上映射的端口即可访问 但该访问过程经过公网 存在数据被截取的风险 当前北京总公司空闲一台
  • github前端插件大全

    常用的插件和库 2017年09月12日 11 42 08 阅读数 1300 本文整合罗列一些平时工作或者练手项目中很可能用到的 github上实用 轻量级 无依赖的插件和库 包括功能插件 UI组件 炫酷动画 前沿技术等 让你在少造轮子的同时
  • STM32/51单片机实训day6(二)——Proteus8.6版本+STM32F103驱动LCD128x64显示信息|Keil5程序设计|串行并行通信笔记

    目录 main c lcd c lcd h 内 容 实现LCD显示 学 时 4学时 知识点 LCD12864芯片介绍 读写操作时序 电路设计 重点 读写操作时序 难点 读写操作时序时间 2022年12月26日 13 30 16 20 总结
  • pb数据窗dw在某一列下怎么去掉重复值

    也就是PB数据窗怎么去掉某一列重复值 如显示结果如下 想到得到如下显示结果 怎么来做 其实吧 很简单 只需要打开数据窗对象 单击 rows 菜单 找到 Suppress Repeating Values 单击弹出如下窗口 把想要去掉重复的列
  • Java数组的应用——数组元素复制(34)

    数组元素的复制 数组元素复制的三种方法及例子 1 一个元素一个元素的复制 使用 号一个一个的赋值 将数组 a1 的元素一个一个的复制给另一个数组 a2 1 代码 方法一 赋值复制 用 System out println 第一种方法 int
  • python print输出语句异常

    今天尝试使用Python 进行相关编程 可以刚刚开始就碰到了拦路虎 python 问题异常 问题分析 print 在python2中是语句 在python3中是函数 python 正常 相关提示 去除print语句 加入print 函数实现
  • 这可能是最为详细的Docker入门吐血总结

    原文地址 https www cnblogs com ECJTUACM 873284962 p 9789130 html Docker是什么 在计算机技术日新月异的今天 Docker 在国内发展的如火如荼 特别是在一线互联网公司 Docke
  • 华为5G认证练习题

    华为5G认证练习题 粗体的是正确答案 粗体的是正确答案 粗体的是正确答案 Ctrl F 可以快速查找题目 第一章 1 移动通信领域 负责制定技术规范和技术报告的是哪个标准组织 单选题 4分 A 3GPP2 B OTSA C 3GPP D I
  • 机器学习 第三讲 机器学习基础、机器学习算法(K-近邻算法、朴素贝叶斯算法)

    文章目录 一 机器学习基础 1 明确几点问题 2 机器学习算法的判别依据 3 机器学习算法分类 4 机器学习开发流程 二 机器学习算法 1 sklearn数据集 1 数据集划分 2 sklearn数据集接口介绍 3 sklearn分类数据集
  • 8.Paper小结——《VFL: A Verifiable Federated Learning withPrivacy-Preserving for Big Data...》

    题目 VFL A Verififiable Federated Learning with Privacy Preserving for Big Data in Industrial IoT VFL 一种可验证的基于隐私的联邦学习 0 Ab
  • upload-labs通关总结

    准备阶段 upload labs下载地址 https github com c0ny1 upload labs 推荐使用php 5 2 17版本 使用其他版本可能会导致页面报错 提示 upload labs目录下需要手动建一个名为uploa
  • 关于SecureEngineConfig.ini有哪些用途?且看软件保护系统Themida常见问题集锦

    Themida是先进的Windows软件保护系统 它被用于满足软件开发人员对于所开发应用程序安全保护的需求 使其远离被先进的逆向工程和软件破解的危险 通过Themida 我们集中在软件保护器所具有的主要弱点 从而提供了解决这些问题的完整解决
  • Java高级 —— 泛型

    目录 泛型概念 泛型可设置多个类型参数 泛型继承 泛型接口 限制泛型可用类型 泛型通配声明 泛型方法 泛型方法限制泛型可用类型 泛型概念 问题引入 如果我们需要产生多个对象 每个对象的逻辑完全一样 只是对象内的成员啊变量的类型不同 那我们如