4.JAVA语言基础部分—枚举与泛型
枚举
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | //定义枚举 enum MyEnum{ ITEM_A, ITEM_B } public static void main(String[] args) { //values()获取所枚举项的集合 MyEnum[] enums=MyEnum.values(); for (MyEnum myEnum : enums) { print(myEnum.toString()); //输出ITEM_A ITEM_B } //valueOf("字符串")把字符串转为枚举 MyEnum myEnum=MyEnum.valueOf( "ITEM_B" ); print(myEnum.toString()); //结果 ITEM_B //compareTo(b)比较两者在定义时的顺序,若b后于比较者返回-1,小于比较者时返回1,相同时为0 int i=MyEnum.ITEM_A.compareTo(MyEnum.ITEM_B); System.out.println(i); //结果 1 //ordinal()得到索引位置,从0开始 int index=MyEnum.ITEM_B.ordinal(); System.out.println(index); //结果 1 } |
枚举也有构造方法,但必须使用private,常用于给枚举项加标签说明功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | // 定义枚举 enum MyEnum { ITEM_A( "我是A啊" ), ITEM_B( "我是B呢" ), ITEM_C( 23 ); // 最后一项要写; private String description; private int num; // 构造方法须用private private MyEnum(String descn) { description = descn; } private MyEnum( int i) { num = i; } // 对外提供获取描述信息 public String getDesn() { return description; } public int getI() { return num; } } public static void main(String[] args) { // values()获取所枚举项的集合 MyEnum[] enums = MyEnum.values(); for (MyEnum myEnum : enums) { print(myEnum.getDesn()); // 我是A啊 我是B呢 null } System.out.print(MyEnum.ITEM_C.getI()); // 23 } |
泛型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //可多个泛型,泛型可以约束 public class Examplte02<T1 extends List, T2> { //可以为字段类型使用泛型 private T2[] mens; //参数可以泛型 public void say(T2 arg) { System.out.println(arg); } //返回数据也可以为泛型 public T1 getResult(T2 arg) { ArrayList<Integer> arrays = new ArrayList<Integer>(); arrays.add(( int ) arg); return (T1) arrays; } } //调用 public static void main(String[] args) { //这里不需要具体到ArrayList<string>等, 且Integer不能使用int代替 Examplte02<ArrayList<Integer>, Integer> exam02= new Examplte02<ArrayList<Integer>, Integer>(); exam02.say( 23 ); ArrayList<Integer> a= exam02.getResult( 25 ); } |
枚举
使用类型通配符
格式: 泛型类名称<? extends List>
? 与T的区别在于,例如一个类里的现个方法要用到T泛型,那么在类上面也要写T。但?就不需要,不受限制。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class Examplte02{ //这里使用通配符后,类名不需要与泛型T那样的写法 public void say(ArrayList<? extends Number> arg) { System.out.println(arg.size()); } } //调用 public static void main(String[] args) { Examplte02 e02= new Examplte02(); ArrayList<Integer> as= new ArrayList<Integer>(); as.add( 10 ); e02.say(as); //这里可传Double也行,因为Double继承于Number ArrayList<Double> as2= new ArrayList<Double>(); as2.add(20d); e02.say(as2); } |
注意
1 2 3 4 5 6 7 8 9 10 | public class Examplte02{ //这里使用supper,说明类型必须是Number或Number的父类,这里向上限制;extends是向下限制 public void say(ArrayList<? super Number> arg) { arg.add( 25 ); //这里会报错,使用通配符后只能读和删除,不能新增或变更值 arg.get( 0 ); //这里正常 arg.remove( 0 ); //这里正常 System.out.println(arg.size()); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构