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());
    }
}
posted @   evemen  阅读(165)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· .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语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示