• java泛型总结


    1 说明

    1)Generics是对java语言类型系统的一种扩展,以支持创建可以按类型进行参数化的类或者方法。

    2)泛型的优点:

      1. 类型安全(使用泛型时,编译器可以捕获附加类型信息,从而类型错误在编译时被捕获而不是运行时来进行检测)

      2. 消除强制类型转换,减少了代码出错的可能性,并且使代码更加可读

    2 泛型类实例

    不使用泛型,此种情况需要类型转换

    package com.wish.generic;
    
    public class Person {
        private Object x;
        private Object y;
        private Object z;
        public Object getX(){
            return x;
        }
        public void setX(Object x){
            this.x =x;
        }
        public Object getY(){
            return y;
        }
        public void setY(Object y){
            this.y =y;
        }
        public Object getZ(){
            return z;
        }
        public void setZ(Object z){
            this.z =z;
        }
        public static void main(String[] args) {
            Person s = new Person();
            s.setY(20);
            int x = (Integer)s.getX();
            System.out.println(x);
        }
    
    }

    使用泛型:

    package com.wish.generic;
    
    public class PersonG<T1,T2>{
        private T1 x;
        private T2 y;
        public T1 getX(){
            return x;
        }
        public void setX(T1 x){
            this.x = x;
        }
        public T2 getY(){
            return y;
        }
        public void setY(T2 y){
            this.y = y;
        }
        public static void main(String[] args){
            PersonG<Integer,String> pg = new PersonG<Integer,String>(); //实例化时即可定义类型
            pg.setX(20);
            pg.setY("this is a string");
            System.out.println(pg.getX());
            System.out.println(pg.getY());
        }
    }

    3.泛型方法

    说明:

      1)泛型的声明必须在方法的修饰符(public,static,final,abstract等)之后,返回值声明之前

      2)和泛型类一样,可以声明多个泛型,用逗号隔开

    泛型方法类:

    package com.wish.generic;
    public class GenFunction {
        public static<T> void display(T t){
            System.out.println(t.getClass());
        }
    }

    测试类:

    package com.wish.generic;
    
    public class Driver {
        public static void main(String[] args) {
            GenFunction.display(11);
            GenFunction.display(11f);
            GenFunction.display("abcd");
        }
    }

    输出:

    class java.lang.Integer
    class java.lang.Float
    class java.lang.String

    关于类型擦除的说明:类型擦除是指运行期不关注泛型的类型信息,但是t.getClass返回的是实例的类型类型而不是泛型的信息

    4.注意事项

    1)Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节代码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉(类型擦除)

    2)泛型类并没有自己独有的Class类对象。比如并不存在List<String>.class或是List<Integer>.class,而只有List.class。

  • 相关阅读:
    SDWebImage内部实现过程
    物理仿真元素
    物理仿真元素
    运行时案例
    使用运行时交换我们自定义的方法
    运行时交换系统方法
    HTML 钟表 小时钟
    JS小游戏寻找房祖名
    程序启动的完整过程
    ApplicationDelegate里的方法
  • 原文地址:https://www.cnblogs.com/wishyouhappy/p/3665569.html
Copyright © 2020-2023  润新知