美文网首页
泛型,枚举

泛型,枚举

作者: 云承寒 | 来源:发表于2017-05-13 17:37 被阅读0次

    泛型的用处

    • 将运行时的异常提前至了编译时
    • 避免了无谓的强制类型转换

    自定义泛型

    • 自定义泛型就是一个数据类型的占位符或者是一个数据类型的变量。

    • 自定义泛型的命名符合标识符的规则即可,但时,一般用大写字母T(Type) 或 E (Element)表示。

    1.方法上自定义泛型
    修饰符 <声明的自定义泛型> 返回值类型 函数名(使用的自定义泛型...) {
    
        
    }
    
    public <T> T test(T t) {
    
        return t;
    }
    
    2.泛型类
    class 类名<声明自定义泛型>{
    
    
    }
    
    class Test<T> {
    
        public void add(T t) {
    
        }
    
        public T remove(T t) {
            return t;
        }
    }
    
    注意
    1.泛型类定义的泛型的具体数据类型,是在使用该类创建对象时确定的。
    2.当使用泛型类创建对象时,没有指定具体的泛型数据类型,则默认为Object。
    3.泛型类上的自定义泛型,不能作用于静态方法。
    4.静态方法如果要使用自定义泛型,需要自己声明使用。
    
    3.泛型接口
    interface 接口名<声明自定义泛型> {
    
        返回值类型 函数名(使用的自定义泛型...);
    }
    
    interface Test<T> {
    
        T add(T t);
    }
    
    //如果要延长接口自定义泛型的具体数据类型,那么格式如下
    class ImpTest<T> implements Test<T> {
    
        @Override
        public T add(T t) {
            return null;
        }
    }
    
    注意
    1.泛型接口定义的泛型的具体数据类型,是在实现接口的时候确定的。
    2.当使用泛型接口时,没有指定具体的泛型数据类型时,则默认为Object类型。
    

    泛型的上下限
    限制上下限需要通配符:?
    
    上限:? super 目标类
    下限:? extends 目标类
    
    1.泛型的上限

    定义一个函数可以接收任意数据类型的集合对象,要求接收的集合对象只能存储Integer或者其父类类型的数据。

    public static<T> Collection<? super Integer> test(Collection<? super Integer> t) {
    
            return t;
    }
    
    2.泛型的下限

    定义一个函数可以接收任意数据类型的集合对象,要求接收的集合对象只能存储Number或者其子类类型数据。

    public void test(Collection<? extends Number> collection) {
    
    }
    
    泛型的擦除转换

    泛型编译之后就消失(擦除)。
    当把带有泛型的集合赋给不带泛型的集合,此时泛型就被擦除(手动擦除)。

        ArrayList<Integer> arrayList = new ArrayList<>();
            ArrayList arrayList2 = new ArrayList<>();
            //泛型擦除
            arrayList2 = arrayList;
            arrayList2.add("Test");
            System.out.println(arrayList2);
    

    枚举

    enum Demo {
        MAN, WOMAN;
    }
    
    枚举应用场景

    如果存在多个数据选项,但每次只能选择一个时,可以用枚举。

    枚举注意细节

    1.枚举是一个特殊的类,枚举值必须位于枚举类的第一行。

    2.枚举类的构造方法默认的修饰符是private,自定义的构造函数也要是private。

    3.枚举值默认的修饰符是public static final,可以定义自己的成员变量与成员函数

    4.枚举值的数据类型是该枚举值所属类的类型,然后枚举值是指向了本类的对象的。

    5.枚举类可以存在抽象方法,但是枚举值必须要实现抽象的方法。

     public static void main(String[] args) {
            Demo demo = Demo.MAN;
            demo.value = "测试数据";
            demo.run();
    }
    
    enum Demo {
        MAN("男") {
            @Override
            public void run() {
                System.out.println("男人疾跑:" + value);
            }
        }, WOMAN("女") {
            @Override
            public void run() {
                System.out.println("女生慢跑:" + value);
            }
        };
    
        String value;
    
        Demo(String value) {
            this.value = value;
        }
    
        public abstract void run();
    }
    
    enum EnumDemo {
        MAN, WOMAN
    }
    
    public class Main {
    
        public static void main(String[] args) {
            demo(EnumDemo.MAN);
        }
    
        public static void demo(EnumDemo demo) {
            switch (demo) {
                case MAN:
                    System.out.println("男");
                    break;
    
                case WOMAN:
                    System.out.println("女");
                    break;
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:泛型,枚举

          本文链接:https://www.haomeiwen.com/subject/qrbxxxtx.html