JAVA 枚举、泛型

12【Java学习笔记】枚举类与泛型 在Java语言中,使用关键字enum定义一个枚举类型。例:使用枚举类型来指定一周中的天数星期日,星期一,星期二,星期三,星期四,星期五,星期六在任何时候,如果需要代表一系列固定的常量,就应该使用枚举类型。在两种情况下,尽可能使用枚举类型:一种是自然的枚举类型,例如,表示太阳系中的行星或者员工的性别,这是一组 固定的值,所以在程序中应该使用枚举类型来表示;另一种是程序在编译的时候,已经知道某个数据所有可能的值,也要尽可能的使用枚举类型。例如,在扑克牌游戏中,花色是固定的。 阅读详情
一、枚举

枚举作用是限定某个类成员变量取值是某些固定值,如生活中交通灯抽象成类、颜色为成员变量,则该成员变量就应该有且只有红、黄、绿三个颜色。如果把一周这个事物抽象成类,Day为成员变量,那么成员也是有且只有周一到周日。无论是交通灯还是一周,用户对他们的实例的颜色和Day成员都不能随便赋值,只能赋予其合理合法的值。枚举就能够满足这个要求。

在JDK1.5以前,普通类通过修饰符的限定可以使其具有这样的功能,1.5以后JDK追加了枚举类。

下面是普通类方式来实现交通灯:

public abstract class Lamp {
	private int time;

	public int getTime() {
		return time;
	}

	private Lamp(int time) { // 私有其构造方法
		this.time = time;
	}

	public abstract Lamp nextLight();// 抽象方法 返回下一个交通灯

	public final static Lamp RED = new Lamp(30) {
		@Override
		public String toString() {
			return "红灯";
		}

		@Override
		public Lamp nextLight() {
			return GREEN;
		}
	};
	public final static Lamp GREEN = new Lamp(45) {
		@Override
		public String toString() {
			return "绿灯";
		}

		@Override
		public Lamp nextLight() {
			return YELLOW;
		}
	};
	public final static Lamp YELLOW = new Lamp(5) {
		@Override
		public String toString() {
			return "黄灯";
		}

		@Override
		public Lamp nextLight() {
			return RED;
		}
	};

}

测试:

public class MTest {
	public static void main(String[] args) {
		Lamp green=Lamp.GREEN;
		System.out.println(green+":"+green.getTime()+" 下一个-->"+green.nextLight());
		Lamp red=Lamp.RED;
		System.out.println(red+":"+red.getTime()+" 下一个-->"+red.nextLight());
		Lamp yellow=Lamp.YELLOW;
		System.out.println(yellow+":"+yellow.getTime()+" 下一个-->"+yellow.nextLight());
	}
}

结果:

绿灯:45 下一个-->黄灯
红灯:30 下一个-->绿灯
黄灯:5 下一个-->红灯


下面是Enum类方式:

public enum Lamp {
	RED(30) {
		@Override
		public String toString() {
			// TODO Auto-generated method stub
			return "红灯";
		}

		@Override
		public Lamp nextLamp() {
			// TODO Auto-generated method stub
			return GREEN;
		}
	},
	GREEN(40) {
		@Override
		public String toString() {
			// TODO Auto-generated method stub
			return "绿灯";
		}

		@Override
		public Lamp nextLamp() {
			// TODO Auto-generated method stub
			return YELLOW;
		}
	},
	YELLOW(5) {
		@Override
		public String toString() {
			// TODO Auto-generated method stub
			return "黄灯";
		}

		@Override
		public Lamp nextLamp() {
			// TODO Auto-generated method stub
			return RED;
		}
	};
	private int time;

	public int getTime() {
		return time;
	}

	public abstract Lamp nextLamp();

	private Lamp(int time) {
		this.time = time;
	}

}

测试结果同样是:

绿灯:45 下一个-->黄灯
红灯:30 下一个-->绿灯
黄灯:5 下一个-->红灯

二、泛型

一个工厂可以生产冰箱和空调,使用一模一样的包装箱子。当空调和冰箱装进箱子后外观一模一样,别人也无法分辨里面装的到底是什么东西,假如客户本来想买空调使用其调节空气功能,结果到家打开盒子通上电发现是冰箱,没有调节空气的功能,客户疯了。但是如果厂家再生产包装箱时,包装箱都贴上冰箱和空调的标签,工人们装箱时只限定空调装进空调包装箱,冰箱装进冰箱箱子。装错了,流水线上的负责监督的领导就批评他扣他工资。这样就保证客户到手的东西一定是想要的,也一定有其对应的功能。

把上边的例子抽象到Java里,容器就是java里的容器类比如集合List,空调或冰箱就是要装进集合内的对象IceBox和Aircon,那么箱子的标签就是泛型,比如给装IceBox和Aircon的箱子打上标签就是List<IceBox>和List<Aircon> ,流水线上负责监督的领导就是Java编译器,他能够保证List<IceBox>和List<Aircon>引用的对象只能装入IceBox和Aircon。这样既能够保证调用者拿到标签上(泛型)上的东西也免去了类型转换这一过程。

如下:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<IceBox> list=new ArrayList<IceBox>();
		IceBox icebox1=new IceBox();
		IceBox icebox2=new IceBox();
		IceBox icebox3=new IceBox();
		IceBox icebox4=new IceBox();
		list.add(icebox1);
		list.add(icebox2);
		list.add(icebox3);
		list.add(icebox4);
	}

除了上面一种跟在容器后面作为“标签”的作用以外,还有另一种用法,一个类的成员变量的类型如果需求有多种,则该成员变量类型不固定,如果没有泛型就只能有多少种需求写多少种“可能”,泛型出现后可以跟在类后面作为不固定成员类的“通配符”

public class MTest {
	public static void main(String[] args) {
		List<String> strs = new ArrayList<String>();
		strs.add("aaa");
		strs.add("bbb");
		strs.add("ccc");
		printCollecrion(strs);
		List<Integer> nums = new ArrayList<Integer>();
		nums.add(1);
		nums.add(2);
		nums.add(3);
		printCollecrion(nums);
	}

	private static void printCollecrion(Collection<?> collection) {
		// TODO Auto-generated method stub
		for (Object iterable_element : collection) {
			System.out.println(iterable_element);
		}
	}
	
	
	/**
	 * @param collection
	 * 自定义泛型T 用以接收任意类型对象 
	 */
	private static <T> void printCollecrion1(Collection<T> collection) {
		// TODO Auto-generated method stub
		for (T t : collection) {
			System.out.println(t);
		}
	}
}

以上?表示代表任何类型,而T是自定义用以接收对象的类型,并且可以用对象。

泛型限定:

设置泛型对象的上限使用extends,表示参数类型只能是该类型或该类型的子类

public class MTest {
	public static void main(String[] args) {
		List<Animal> list=new ArrayList<Animal>();
		printName(list);
		//错:The method printName(Collection<? extends Person>) in the type MTest is not applicable for the arguments (List<Animal>)
	}

	// 泛型限制该方法只能接受Person和其子类的集合参数
	public static void printName(Collection<? extends Person> collection) {

	}
}

class Person {

}

class Student extends Person {

}

class Teacher extends Person {

}

class Animal {

}

设置泛型对象的下限使用super,表示参数类型只能是该类型或该类型的父类:

public class MTest {
	public static void main(String[] args) {
		List<Student> list=new ArrayList<Student>();
		printName(list);
		//错:The method printName(Collection<? super Teacher>) in the type MTest is not applicable for the arguments (List<Student>)
	}

	// 泛型限制该方法只能接受Teacher和其父类的集合参数
	public static void printName(Collection<? super Teacher> collection) {

	}
}

class Person {

}

class Student extends Person {

}

class Teacher extends Person {

}

class Animal {

}

此外反省还允许嵌套使用,如用常见的Map取出的操作

public static void main(String[] args) {
		Map<String, String> map = new HashMap<String, String>();
		map.put("name", "zhangshan");
		map.put("age","15" );
		map.put("add", "beijing");
		Set<Map.Entry<String, String>> set=map.entrySet();
		for(Map.Entry<String, String> ob:set){
			System.out.println(ob.getKey());
			System.out.println(ob.getValue());
		}
		
		
	}


自定义泛型


下面是简单模拟(忽略存储结构和重复元素的问题)Map类MyMap 通过两个List存储Key和Value ,通过index建立联系。
class MyMap<K, V> {
	private K k;// 模拟key
	private V v;// 模拟value
	// 用list存储Key和Value
	List<K> klist = new ArrayList<K>();
	List<V> vlist = new ArrayList<V>();
	
	public <K, V> MyMap() {
		// TODO Auto-generated constructor stub
	}
	
	// 模拟put方法
	public void put(K k, V v) {
		klist.add(k);
		vlist.add(v);
	}

	// 模拟get方法 根据传入的key所在klist的index 获取在vlist的value
	public V get(K k) {

		for (int i = 0; i < klist.size(); i++) {
			if (klist.get(i).equals(k))
				return vlist.get(i);
		}
		return null;
	}
}

测试:

public class MyMapTest {
	public static void main(String[] args) {
		MyMap<String, String> map = new MyMap<String, String>();
		map.put("aaa", "你好");
		map.put("bbb", "黑马");
		map.put("ccc", "程序");
		map.put("ddd", "员");
		System.out.println(map.get("ccc"));
	}
}

打印结果:

程序

null



自定义泛型除了可以定义到类上,还可以定义到方法上,比如要写一个方法在任何类型数组,给定两个索引位置就能够交换,如下:

public class MTest {
	public static void main(String[] args) {
		Integer[] arr1 = { 1, 2, 3 };
		String[] arr2 = { "aaa", "bbb", "ccc" };
		swap(arr1, 0, 2);
		swap(arr2, 0, 2);
		System.out.println(Arrays.toString(arr1));
		System.out.println(Arrays.toString(arr2));
	}

	public static <T> void swap(T[] arr, int index1, int index2) {
		T temp = arr[index1];
		arr[index1] = arr[index2];
		arr[index2] = temp;
	}
}
结果:

[3, 2, 1]
[ccc, bbb, aaa]


注意:上面用的是integer而不是int,因为泛型限定不能使用基本数据类型,如果使用int编译器不会通过。




【LabVIEW懒人系列教程-视觉入门】2.6LabVIEW模板匹配之创建模板 上期2.5在Labview软件框架中实现了模板匹配功能的运用,然而我们的模板图像是通过视觉助手创建出来的,在实际项目中这样做 ,难免有些不妥。所以,今天就给大家讲解一下,如何编写创建模板功能,模板图像的创建与加载需要注意一些什么。 模板图片的创建,大家可以理解为将图像中的一个特征区域扣下来,通过Labview函数进行信息学习,然后保存成带有图像信息的模板图。 具体做法,下面为大家演示一下 百度网盘视频链接:https://pan.baidu.com/s/1-zxcJBxPgk4t1Ej.. 阅读详情

相关推荐

如何手动打包Linux(麒麟系统)的Qt程序

Qt在windows上有自带的windeployqt来帮助打包程序,但是对于linux系统来说Qt并没有自带对应的打包程序。尽管存在开源的linuxdeployqt打包程序,但是在使用的过程中会出现很多问题,对于arm架构的系统来说需要编译并修改源码等等。确定你程序所需要的插件,然后将你使用的Qt版本对应的插件复制到plugins里边。你可以根据各个库后面的路径来找到对应的库,并将它们全部复制到之前创建的lib目录下。复制你的可执行程序到bin目录下(将 your_executable。

qq_45903233的博客 3610

Java 枚举类型与泛型

Object类为最上层父类,为了使程序更具有普适性,通常使传入返回的值都以Object类为主,当需要使用时必须进行类型转换。类名 < T > //T为类型名使用泛型定义的类可以在类中以一个通用符号表示数据类型,声明该类对象时再根据需求指定的真正类型,而在类的方法中传参时不再需要进行类型转换。//定义泛型类 private T over;//定义泛型成员变量 public T getOver() {} }泛型的参数类型只能是类类型,不能是简单类型,如A< int >是错误的。

zjh17393161150的博客 761

Blender SMPL-X 插件安装

Blender XMPL-X 插件安装

heleneveryday的专栏 5358

Java泛型和枚举

Java泛型和枚举

qq_52215881的博客 1317

直线电机驱动技术原理与应用解析

直线电机作为直接电能-直线运动转换装置,其核心原理基于电磁感应定律和洛伦兹力公式。通过三相交流电在定子绕组中产生行波磁场,与动子永磁体相互作用实现精准推力控制。相比传统旋转电机传动系统,直线电机具有零传动间隙、高动态响应(加速度可达10g)和微米级定位精度等技术优势,这使其成为半导体光刻机、精密数控机床等高端装备的关键驱动部件。现代直线电机驱动单元通常采用三环控制架构(电流环、速度环、位置环),配合SiC功率器件和高分辨率光栅反馈,实现纳米级运动控制。随着模块化设计和直接冷却技术的发展,直线电机正朝着更高功

weixin_26802933的博客 260

告别校准烦恼:用ADS1220和松下ERA3电阻实现±0.05℃精度的Pt100测温方案(附完整电路图)

本文详细介绍了如何利用TI的ADS1220 24位ΔΣ ADC与松下ERA3系列精密电阻构建±0.05℃精度的免校准Pt100测温系统。通过比例测量法架构和关键器件选型,解决了传统方案中的校准繁琐和长期稳定性问题,特别适用于工业控制、医疗设备等高精度温度测量场景。

weixin_30740581的博客 613

Java 枚举与泛型

Java 枚举 之前写过的文档:https://blog.youkuaiyun.com/Roobert_Chao/article/details/78637972

RobertChao的博客 5121

MiniMaxH3+ComfyUI本地部署:一键整合包、工作流搭建与报错排查

本地部署视频生成模型时,模型权重、推理框架与自定义节点的匹配是核心挑战。MiniMaxH3作为多模态生成模型,通常依赖ComfyUI这类节点式工作流引擎实现可视化调度。一键整合包将Python环境、PyTorch算子、模型文件预置封装,大幅降低部署门槛,并通过半精度加载、显存碎片回收等机制优化推理速度。在文生视频、图生视频与批量生成场景中,清晰的节点链路和参数调优能力直接影响输出质量与显存占用。针对模型不识别、节点执行失败等高频问题,系统排查命令行日志与模型目录可快速定位故障。本文以MiniMaxH3整合包

weixin_29047545的博客 585

Java泛型,枚举,注解

Java基础7(泛型,枚举,注解) 1 泛型 1.1 什么是泛型 泛型:即参数化类型。在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型。 解决集合中的两个问题:(1)元素存储的安全问题(添加元素时,检查添加元素的类型);(2)元素的类型装换问题 泛型可以起到对类的限定作用。 1.2...

fighting 1056

【unity游戏开发入门到精通——通用篇】Post Processing 后处理插件Post-process Volume 和 Volume最全基础使用说明

之前我已经实现了不少后处理功能,本文其实就是将他们归类整理,以便更好的查找和理解。在Unity中,后处理(Post-Processing)是在相机所捕捉的图像上应用一些特殊效果的过程,后处理会让图像视觉效果更好(前提是做的好)。这些效果的范围有非常细微的颜色调整,也包括整体的美术风格的大修,可以让场景看起来更加真实或风格化,或者只是变得更好看。就像我们都会用手机拍照,但很多时候我们拍的原始的相片都打不到我们想要的效果。比如照片可能亮度不够,颜色不饱和或者对比度不好等。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 7900

2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题5)-网络部分解析-附详细代码

2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题5)-网络部分解析-附详细代码

bfq05234214的博客 417

java 枚举与泛型_Java中枚举和泛型用法

文章目录枚举类型使用枚举类型设置常量深入了解枚举类型操作枚举类型成员的方法枚举类型中构造方法泛型定义泛型类泛型的常规用法泛型的高级用法枚举类型使用枚举类型设置常量public class ConstantsTest {enum Constants2 { // 将常量放置在枚举类型中Constants_A, Constants_B}// 定义一个方法,这里的参数为枚举类型对象public stati...

weixin_30100299的博客 1044

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java枚举与泛型

枚举介绍操作枚举类型成员的方法枚举类型中的构造方法 介绍 继承java.lang.Enum 枚举类型可以取代常量的定义方式,即将常量封装在类或接口中。本质上还是类的形式。 单独定义枚举 使用方法: 枚举名.常量名 Constants.Constants_A; 类中定义枚举 这种内部类的形式,编译改类时,除了ConstantsTest.class类之外,还存在ConstantsTest $ 1.class和ConstantsTest $ Constants2.class 文件。 操作枚举类型成员

weixin_44949462的博客 686

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java枚举与泛型

java枚举 解释:枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。枚举在曰常生活中很常见,例如一个人的性别只能是“男”或者“女或者人妖”,一天只能有24小时等。类似这种当一个变量有几种固定可能的取值时,就可以将它定义为枚举类型。 在 JDK 1.5 之前没有枚举类型,那时候一般用接口常量来替代。而使用 Java 枚举类型 enum 可以更贴近地表示这种常量。 声明枚举 声明枚举时必须使用 enum 关键字,然后定义枚举的名称、可访问性、基础类型和成员等。枚举声明的语法如下: enum-mod

抚琴 1398

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java中的泛型和枚举

泛型和枚举都是JDK1.5版本之后加入的新特性,泛型将程序代码的类型检查提前到了编译期间进行,枚举类型增强了程序代码的健壮性。 1. 泛型 在JDK1.5版本之前,如果在集合中添加了不同类型的数据,需要在程序的运行期间对类型之间的转换进行检查。 例如: List arrayList=new arrayList(); 在arrayList中添加String类型的对象和Integer对象,但

海瑞@mt 3927

java 泛型 枚举_详解Java中的 枚举与泛型

详解Java中的 枚举与泛型一:首先从枚举开始说起枚举类型是JDK5.0的新特征。Sun引进了一个全新的关键字enum来定义一个枚举类。下面就是一个典型枚举类型的定义:public enum Color{RED,BLUE,BLACK,YELLOW,GREEN}显然,enum很像特殊的class,实际上enum声明定义的类型就是一个类。 而这些类都是类库中Enum类的子类(Java.lang.Enu...

weixin_36131079的博客 481

java 泛型不能用枚举

我整理的一些关于【Java】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/f2PFnN理解 Java 泛型与枚举的关系 在 Java 编程中,泛型是一种强大的功能,它允许开发者在类、接口和方法中定义与特定数据类型无关的类型安全逻辑。然而,处理泛型时,你可能会发现 Java ...

weixin_40188886的博客 126

java 泛型枚举_java枚举泛型

有!泛型和枚举都是JDK1.5版本之后加入的新特性,泛型将程序代码的类型检查提前到了编译期间进行,枚举类型增强了程序代码的健壮性。1. 泛型在JDK1.5版本之前,如果在集合中添加了不同类型的数据,需要在程序的运行期间对类型之间的转换进行检查。例如:List arrayList=new arrayList();在arrayList中添加String类型的对象和Integer对象,但是我们定义如下一...

weixin_39580042的博客 914

java枚举,泛型学习

java枚举 public enum seasons2 { SPRING,SUMMER,WINTER,AUTUMN } /* * 以下两种方法都可以创建枚举对象,显然第二种方法要好过于第一种方法,避免了抛出空枚举异常,导致程序编译通过而运行出错。 */ public class 枚举对象创建 { public static void main(String[] args) { se...

baldicoot_的博客 203

JAVA高级编程之泛型&枚举

泛型 泛型是JDK5的新特性;泛型指广泛的类型,即类型参数化; 泛型擦除: 泛型只存在编译期,运行期就会消失; 泛型类: 定义:在定义类的时候在类名后面直接使用 < T > 形式指定泛型; 当子类继承一个泛型父类时,如果子类不是泛型类,则需要明确父类上的泛型参数;如果在子类继承泛 型父类时没有给父类指定泛型参数,则需要将子类也定义成泛型类,并且子类的泛型参数变量名要和父类 保...

zy 224

java 泛型 枚举_Java中的枚举与泛型

本周初步认识了下java中的枚举与泛型。先来说一下枚举:java语言中由关键字enum来定义一个枚举类型。枚举的特点是有限且固定的类,枚举类是再JDK1.5版本中才引入的,存放在java.lang包中。枚举类型语法:修饰符 enum 枚举类型名称{常量1,常量2,.....常量n;}其中enum声明为枚举类型,程序体定义常量,当需要使用该常量时,可以用“类名.常量”来表示。下面是枚举类型的一些常用...

weixin_35891825的博客 354

JAVA基础之枚举和泛型

枚举 Java中引用类型:数组、类、接口、枚举、注解 什么是枚举 枚举是一个引用类型,枚举就是一个规定了取值范围的变量类型。 枚举变量不能使用其他的数据,只能使用枚举中常量赋值。提高程序安全性 声明枚举: public enum Season{ SPRING, SUMMER, AUTUMN, WINTER; ...

weixin_44205039的博客 238

java基础知识总结7(枚举+泛型)

七、枚举枚举是一个类类型,是JDK1.5的新特性 枚举的关键字是enum Java中所有的枚举类都是java.lang.Enum的子类注意:枚举类中可以包含成员有【字段(常量)、方法(构造方法、普通方法)】枚举中不能有number;不能赋值————类只有顺序可以比较———–语法:enum 枚举名{ 枚举体 }例:enum Direction{//枚举体 EAST,SOUTH,WE

听风暖的博客 2万+

Java中泛型与枚举

一、  java中的泛型:泛型的主要作用是使得一个集合(要明确主要是对于集合)只能存放一个同一类型的数据(包括引用类型和基本数据类型)。这样就可以避免同一集合中出现不同元素,导致我们无法用同一样的方法来处理这些数据。来,我们来看代码。public class Testaa {@Testpublic  void iii() { DAO &lt;User&gt; dao =new DAO &lt;Us...

moutain0101的博客 840

Java枚举,Java泛型详解

一:首先从枚举开始说起 枚举类型是JDK5.0的新特征。Sun引进了一个全新的关键字enum来定义一个枚举类。下面就是一个典型枚举类型的定义: public enum Color{ RED,BLUE,BLACK,YELLOW,GREEN } 显然,enum很像特殊的class,实际上enum声明定义的类型就是一个类。 而这些类都是类库中Enum类的子类(java.lang.Enum)。它

Henryzai的专栏 535
上一篇: JAVA 反射
下一篇: 工作中用到的小算法,计算两日期间隔xx年xx月xx天
SetO2
博客等级 码龄12年 5粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值