Java自定义泛型类注意点

news2024/11/28 7:46:26

 

目录

自定义泛型类

 如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为Object类型

由于子类在继承带泛型的父类时,指明了泛型类型。则实例化子类对象时,不需要指明类型

 由于子类在继承带泛型的父类时,没有指明了泛型类型。则实例化子类对象时,要指明类型

 泛型不同的引用不能相互赋值

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

 异常类不能声明为泛型类

 不能使用new E[], 但是可以E[] arr =(E []) new Object[capacity]

泛型方法:在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系.

换句话说,泛型方法所属的类是不是泛型类都没有关系

泛型方法可以是静态的,即copyFromArrayToList可以是静态的


 

自定义泛型类

public class Order<T> {

	String orderName;
	int orderId;
	
	//类的内部结构使用类的泛型
	T orderT;
	
	public Order() {
		
	}
	
	public Order(String orderName,int orderId, T orderT) {
		this.orderName=orderName;
		this.orderId=orderId;
		this.orderT=orderT;
	}
	
	public T getOrderT() {
		return this.orderT;
	}
	
	public void setOrderT(T orderT) {
		this.orderT=orderT;
	}

	@Override
	public String toString() {
		return "Order [orderName=" + orderName + ", orderId=" + orderId + ", orderT=" + orderT + "]";
	}
	
	
}

 如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为Object类型

@Test
	public void test1() {
		//如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为Object类型
		//要求:如果程序定义了类是带泛型的,建议在实例化时,要指明类的泛型。
		
		Order order=new Order();
		order.setOrderT(123);
		order.setOrderT("ABC");
		
		
		//建议:实例化时指明类的泛型
		Order<String> order1=new Order<>("orderAA",1001,"");
		order1.setOrderT("AA:hello");
	}

由于子类在继承带泛型的父类时,指明了泛型类型。则实例化子类对象时,不需要指明类型

/**
 * SubOrder不是泛型类
 * @author CharlieLiang
 *
 */
public class SubOrder extends Order<Integer>{

}


//在另一个类中的代码
@Test
	public void test2() {
		SubOrder sub1=new SubOrder();
		
		//由于子类在继承带泛型的父类时,指明了泛型类型。则实例化子类对象时,不需要指明类型
		sub1.setOrderT(1122);
		
	}

 由于子类在继承带泛型的父类时,没有指明了泛型类型。则实例化子类对象时,要指明类型

/**
 * SubOrder2<T>仍然是泛型类
 * @author CharlieLiang
 *
 * @param <T>
 */
public class SubOrder2<T> extends Order<T>{

}


//另一个类中的方法
@Test
	public void test3() {
		//由于子类在继承带泛型的父类时,没有指明了泛型类型。则实例化子类对象时,要指明类型
		SubOrder2<String> sub2=new SubOrder2();
		sub2.setOrderT("order2...");
	}

 泛型不同的引用不能相互赋值

@Test
	public void test4() {
		ArrayList<String> list1=new ArrayList<>();
		ArrayList<Integer> list2=new ArrayList<>();
		
		//泛型不同的引用不能相互赋值
//		list1=list2;
	}

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

/**
 * 自定义泛型类
 * @author CharlieLiang
 *
 * @param <T>
 */
public class Order<T> {

	String orderName;
	int orderId;
	
	//类的内部结构使用类的泛型
	T orderT;
	
	public Order() {
		
	}
	
	public Order(String orderName,int orderId, T orderT) {
		this.orderName=orderName;
		this.orderId=orderId;
		this.orderT=orderT;
	}
	
	public T getOrderT() {
		return this.orderT;
	}
	
	public void setOrderT(T orderT) {
		this.orderT=orderT;
	}

	@Override
	public String toString() {
		return "Order [orderName=" + orderName + ", orderId=" + orderId + ", orderT=" + orderT + "]";
	}
	
	
	//静态方法中不能使用类的泛型
//	public static void show(T orderT) {
//		System.out.println("ABC");
//	}
	
}

 异常类不能声明为泛型类

/**
 * 异常类不能声明为泛型类
 * @author CharlieLiang
 *
 * @param <T>
 */
public class MyException<T> extends Exception{

}

 不能使用new E[], 但是可以E[] arr =(E []) new Object[capacity]

        //编译不通过
		T[] arr=new T[10];
		
		//编译通过
		T[] arr2 =(T[]) new Object[10];

泛型方法:在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系.

换句话说,泛型方法所属的类是不是泛型类都没有关系

import java.util.ArrayList;
import java.util.List;

/**
 * 自定义泛型类
 * @author CharlieLiang
 *
 * @param <T>
 */
public class Order<T> {

	String orderName;
	int orderId;
	
	//类的内部结构使用类的泛型
	T orderT;
	
	public Order() {
		//编译不通过
//		T[] arr=new T[10];
		
		//编译通过
		T[] arr2 =(T[]) new Object[10];
	}
	
	public Order(String orderName,int orderId, T orderT) {
		this.orderName=orderName;
		this.orderId=orderId;
		this.orderT=orderT;
	}
	
	/**
	 * 如下的3个方法都不是泛型方法
	 * @return
	 */
	public T getOrderT() {
		return this.orderT;
	}
	
	public void setOrderT(T orderT) {
		this.orderT=orderT;
	}

	@Override
	public String toString() {
		return "Order [orderName=" + orderName + ", orderId=" + orderId + ", orderT=" + orderT + "]";
	}
	
	
	//静态方法中不能使用类的泛型
//	public static void show(T orderT) {
//		System.out.println("ABC");
//	}
	
	
	//泛型方法:在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系
	//换句话说,泛型方法所属的类是不是泛型类都没有关系
	public <E> List<E> copyFromArrayToList(E[] arr){
		ArrayList<E> list=new ArrayList<>();
		for(E e:arr) {
			list.add(e);
		}
		return list;
	}
}
//测试泛型方法
	@Test
	public void test5() {
		Order<String> order=new Order<>();
		Integer arr[]=new Integer[] {1,2,3,4};
		
		//泛型方法在调用时,指明泛型参数的类型
		List<Integer> list=order.copyFromArrayToList(arr);
		System.out.println(list);
	}

运行结果:

[1, 2, 3, 4]

泛型方法可以是静态的,即copyFromArrayToList可以是静态的

原因:泛型参数是在调用方法时,确定的。并非在实例化类时,确定的。

//泛型方法:在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系
	//换句话说,泛型方法所属的类是不是泛型类都没有关系
	//泛型方法,可以声明为静态的。
	//原因:泛型参数是在调用方法时,确定的。并非在实例化类时,确定的。
	public static <E> List<E> copyFromArrayToList(E[] arr){
		ArrayList<E> list=new ArrayList<>();
		for(E e:arr) {
			list.add(e);
		}
		return list;
	}

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WebDAV之葫芦儿·派盘 + Photosync

PhotoSync 支持WebDAV方式连接葫芦儿派盘。 苹果手机通过无线传输,备份和共享照片/视频到计算机,其他手机,NAS和流行的云和照片服务的最佳解决办法,快来试下PhotoSync同步工具吧。 PhotoSync面向移动设备

安装部署wordpress(Ubuntu)

wordpress是一个目前流行的基于web的内容管理系统软件。它是基于PHP语言和MySQL数据库开发的&#xff0c;用户可以在支持 PHP 和 MySQL数据库的服务器上快速轻松的部署自己的网站&#xff08;博客&#xff0c;外贸网站等等&#xff09;。WordPress有非常多的第三方开发的免费模…

产线工控安全之现状分析及方案应对

产线安全现状 工业控制系统是支撑国民经济的重要设施&#xff0c;是工业领域的神经中枢。现在工业控制系统已经广泛应用于电力、通信、化工、交通、航天等工业领域&#xff0c;支撑起国计民生的关键基础设施。 随着传统的工业转型&#xff0c;数字化、网络化和智能化的工业控…

数学建模---数值微积分

目录 一.引言 二.数值微分 1.数值差分与差商 利用matlab观察差分与差商的区别&#xff1a; 例题&#xff1a; 二.数值积分 1.数值积分基本定理 2.常见的数值积分公式&#xff1a; 积分公式的精度&#xff1a; 3.数值积分的matlab实现 一.引言 在科学研究和工程计算中&…

LINUX提权之环境变量提权篇

前言 上一篇文章给大家介绍了linux中的内核提权的一些知识点不知道大家学的怎么样了&#xff0c;今天给大家带来一个全新的提权方法——“环境变量提权”,本文会介绍关于环境变量提权的基本知识以及利用方法。 环境变量提权 PATH是Linux系统中的环境变量&#xff0c;指定存储…

全球月活用户4年破10亿,TikTok的3大底层逻辑

武汉瑞卡迪电子商务有限公司&#xff1a;在即将过去的2022年&#xff0c;TikTok成为了众多出海品牌想要赢得新生意的重要平台。品牌应该如何看待TikTok&#xff1f;如何利用节点营销抓住机会&#xff1f;那些已经在TikTok上成功的品牌背后&#xff0c;是否有一些定式&#xff0…

centos7安装ansible

在ansible中主控机器必须是linux机器&#xff0c;不可以是windows&#xff0c;但是被控机器可以是windows。 control machine&#xff1a;192.168.184.128 target machine&#xff1a;192.168.184.129(被管理机器上不需要安装什么软件) 1.ansible的安装前提是要有python&…

vue的基础指令演示代码及简单案例

目录 一、内容绑定&#xff0c;事件绑定 v-text v-html v-on 案例&#xff1a;计数器 二、显示切换&#xff0c;属性绑定 v-show v-if v-bind 案例&#xff1a;图片切换 三、列表循环&#xff0c;表单元素绑定 v-for v-on补充 v-model 通过Vue实现常见的网页效果…

QSFP-DD封装小知识,你了解吗?

随着数据中心和高级网络应用中数据流量的上升&#xff0c;光模块市场向更高的速度&#xff0c;更低的功耗和更小的外形或尺寸发展。QSFP-DD封装有什么特征和优势&#xff1f;它与QSFP28/QSFP56模块有什么区别的&#xff1f;本期文章&#xff0c;我们一起了解一下QSFP-DD封装相关…

【Linux篇】之网络文件系统(nfs)配置

nfs : Network File System 网络文件系统 作用&#xff1a;linux内核启动之后&#xff0c;通过网络的方式从ubuntu服务器中挂载根文件系统&#xff0c; 而不需要将根文件系统部署到开发板。 1> 安装nfs服务器端 sudo apt-get install nfs-kernel-server2> 修改nfs服务的…

解读手机拍照的各个参数(AI水印)

AI水印就是在照片里面自动添加一些文字或者符号&#xff0c;里面有一些固定的水印&#xff0c;目前还不了解能不能识别一些不是固定地方的景色。(目前给出来的是黄山、张家界景点&#xff0c;不晓得华山这种能不能自动添加上水印)。

Go 1.19.3 channel原理简析

channel channel和goroutine是Go语言的核心命脉。这篇文章来简单介绍一下Go chan的原理&#xff0c;源码并不好读&#xff0c;应结合gmp调度模型来理解&#xff0c;后续补充吧。 由上图可见&#xff0c;chan的底层结构是一个hchan结构体&#xff0c;其中buf字段指向了一个环形…

网狐大联盟服务端源码分析-服务核心

源码目录结构,如下图,服务工程 cpp文件列表及含义: WHBase64.cpp : base6编码类 WHCommandLine.cpp : 命令行参数操作类 WHDataLocker.cpp : 数据锁类,线程操作数据时用 WHDataQueue.cpp : 数据队列类,异步操作数据用 WHEncrypt.cpp : 加密类 WHIniData.cpp : ini文件操作类 WH…

VGG的成功之处在哪

VGG 网络可以分为两部分&#xff1a;第⼀部分主要由卷积层和汇聚层组成&#xff0c;第⼆部分由全连接层组成VGG与AlexNet相比&#xff0c;VGG采用小的卷积核和池化层&#xff0c;层数更深&#xff0c;通道数更多&#xff0c;其中每个通道代表着一个FeatureMap&#xff0c;更多的…

Tomcat组件生命周期管理:LifeCycle

我们已经知道Catalina初始化了Server(它调用了 Server 类的 init 和 start 方法来启动 Tomcat);你会发现Server是Tomcat的配置文件server.xml的顶层元素,那这个阶段其实我们已经进入到Tomcat内部组件的详解;这时候有一个问题,这么多组件是如何管理它的生命周期的呢? 引…

LabVIEW操控应用程序和VI设置

LabVIEW操控应用程序和VI设置属性是VI、对象或应用程序的特性。方法是在VI、对象或应用程序上进行的操作。用户可通过属性节点和调用节点获取和设置本地或远程应用程序实例、VI和对象上的属性和方法。有些应用程序、VI和对象的设置只能通过属性和方法获取和设置。参考下列使用应…

04【Cookie、Session】

文章目录04【Cookie、Session】一、Cookie1.1 Cookie概述1.1.1 协议的状态1.1.2 Cookie的传递流程1.2 Cookie的操作1.2.1 创建Cookie1.2.2 Cookie的销毁1.2.3 Cookie的获取1.2.4 Cookie中使用特殊字符的情况1.2.5 Cookie的携带路径2.2.6 Cookie的删除二、Session2.1 Session概述…

Deep tabular data learning

ContentsWhy do tree-based models still outperform deep learning on tabular data?Tabular Data (表格数据)NN 处理表格数据的挑战模型的归纳偏置有何不同&#xff1f;模型本质有何不同&#xff1f;做个小结[CIKM 2019] AutoInt: Automatic Feature Interaction Learning v…

【前端】Vue项目:旅游App-(13)home:热门数据的网络请求、store和显示

文章目录目标过程与代码页面html与css获取数据网络请求store展示数据效果总代码修改或添加的文件service的home.jsservice的index.jsstore的home.jshome.vue本项目博客总结&#xff1a;【前端】Vue项目&#xff1a;旅游App-博客总结 目标 天河区、番禺区…等数据是动态的&…

智能物流仓储机器人|海格里斯HEGERLS货物夹抱式防倾倒装置四向穿梭车

在电商以及物流服务行业迅猛发展的当下&#xff0c;自动化立体仓库表面了更加强大的生命力与适应能力。谋求人力节省以及长远发展的电商也需要自动化立体仓库来帮助他们实现这一目标。在现有的技术中会利用穿梭车进行货物转运&#xff0c;但是在转运过程中&#xff0c;由于货物…