泛型语法与使用

本文介绍了Java中的泛型概念,包括泛型的声明、使用实例,如ArrayList和HashSet等集合类的泛型应用。同时,讨论了泛型的注意事项,如类型只能是引用类型,以及泛型的继承和通配符的使用,如<?>、<?>extendsA、<?>superA的含义和应用场景。
摘要由CSDN通过智能技术生成

泛型的语法

  • 泛型的声明

    interface接口< T >{}和class 类 <K,V>{}

    1. 其中T,K,V代表类型
    2. 任意字母都可以
  • 泛型的实例化

    要在类名后面指定类型参数的值

    eg:

    1. List< String > strlist = new ArrayList< String >();
    2. Iterator< Customer > iterator = customer.iterator
    /**
    *泛型使用实例
    */
    public class GenericExercise {
        public static void main(String[] args) {
    
            HashSet<Student> students = new HashSet<Student>();
            students.add(new Student("jack", 18));
            students.add(new Student("tom", 28));
            students.add(new Student("mary", 19));
            for (Student student : students) {
            	System.out.println(student);
            }
    
            HashMap<String, Student> hm = new HashMap<String, Student>();
    
            hm.put("milan", new Student("milan", 38));
            hm.put("smith", new Student("smith", 48));
                hm.put("hsp", new Student("hsp", 28));
    
            Set<Map.Entry<String, Student>> entries = hm.entrySet();
      
            Iterator<Map.Entry<String, Student>> iterator = entries.iterator();
            System.out.println("==============================");
            while (iterator.hasNext()) {
            	Map.Entry<String, Student> next = iterator.next();
            	System.out.println(next.getKey() + "-" + next.getValue());
            }
        }
    }
    
    class Student {
        private String name;
        private int age;
        public Student(String name, int age) {
        	this.name = name;
        	this.age = age;
        }
        public String getName() {
        	return name;
        }
        public void setName(String name) {
        	this.name = name;
        }
        public int getAge() {
        	return age;
        }
            public void setAge(int age) {
        	this.age = age;
        }
        @Override
        public String toString() {
        	return "Student{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
        }
    }
    

    泛型使用的注意事项和细节

    1. interface List< T>{ , public class HashSet< E>()… 等等
      说明:T,E只能是引用类型
      看看下面语句是否正确?:
      List< Integer > list=new ArrayList< Integer>0:/
      List< int> list2 = new ArrayList< int>0://错误

    2. 在给泛型指定具体类型后,可以传入该类型或者其子类类型

    3. 泛型使用形式
      List< Integer> list1 = new ArrayList< Integer>0;
      List< Integer> list2=new ArrayList<>();[说明:]
      如果我们这样写 List list3=new ArrayList();默认给它的泛型是[<E>E就是 Object]

    /**
    *泛型注意事项
    */
    public class GenericDetail {
      public static void main(String[] args) {
    
          List<Integer> list = new ArrayList<Integer>(); 
    
          Pig<A> aPig = new Pig<A>(new A());
          aPig.f();
          Pig<A> aPig2 = new Pig<A>(new B());
          aPig2.f();
    
          ArrayList<Integer> list1 = new ArrayList<Integer>();
          List<Integer> list2 = new ArrayList<Integer>();
    
          ArrayList<Integer> list3 = new ArrayList<>();
          List<Integer> list4 = new ArrayList<>();
          ArrayList<Pig> pigs = new ArrayList<>();
    
          ArrayList arrayList = new ArrayList();
          
          Tiger tiger = new Tiger();
    
      }
    }
    class Tiger<E> {
          E e;
          public Tiger() {}
          public Tiger(E e) {
          	this.e = e;
          }
    }
    class A {}
    class B extends A {}
    class Pig<E> {
          E e;
          public Pig(E e) {
          	this.e = e;
          }
          public void f() {
              System.out.println(e.getClass());
          }
    }
    

自定义泛型

  • 基本语法

    class类名<T,R…>{}

  • 注意细节

    1. 普通成员可以使用泛型(属性、方法)
    2. 使用泛型的数组,不能初始化
    3. 静态方法中不能使用类的泛型
    4. 泛型类的类型,是在创建对象时确定的(因为创建对象时,需要指定确定类型)
    5. 如果在创建对象时,没有指定类型,默认为Object
    /**
    *泛型基本使用
    */
    public class CustomGeneric_ {
        public static void main(String[] args) {
    
            Tiger<Double,String,Integer> g = new Tiger<>("john");
            g.setT(10.9); 
            System.out.println(g);
            Tiger g2 = new Tiger("john~~");
            g2.setT("yy"); 
            System.out.println("g2=" + g2);
        }
    }
    
    class Tiger<T, R, M> {
        String name;
        R r; 
        M m;
            T t;
        T[] ts;
        public Tiger(String name) {
            this.name = name;
        }
        public Tiger(R r, M m, T t) {
            this.r = r;
            this.m = m;
            this.t = t;
        }
        public Tiger(String name, R r, M m, T t) {
            this.name = name;
            this.r = r;
            this.m = m;
            this.t = t;
        }
    }
    
        public String getName() {
        	return name;
        }
        public void setName(String name) {
        	this.name = name;
        }
        public R getR() {
        	return r;
        }
        public void setR(R r) {
        	this.r = r;
        }
        public M getM() {
        }
        public void setM(M m) {
            his.m = m;
        }
        public T getT() {
        	return t;
        }
        public void setT(T t) {
        	this.t = t;
        }
        @Override
        public String toString() {
            return "Tiger{" +
            "name='" + name + '\'' +
            ", r=" + r +
            ", m=" + m +
            ", t=" + t +
            ", ts=" + Arrays.toString(ts) +
            '}';
        }
    }
    
  • 自定义泛型接口

    • 基本语法

      interface接口名<T,R…>{}

    • 注意细节

      1. 接口中,静态成员也不能使用泛型(和泛型类规定一样)
      2. 泛型接口的类型,在继承接口或者实现接口时确定
      3. 没有指定类型,默认为Object
    /**
    *自定义泛型接口
    */
    
    
    interface IA extends IUsb<String, Double> {
    }
    
    class AA implements IA {
        @Override
        public Double get(String s) {
        	return null;
        }
        @Override
        public void hi(Double aDouble) {
        }
        @Override
        public void run(Double r1, Double r2, String u1, String u2) {
        }
    }
    
    class BB implements IUsb<Integer, Float> {
    @Override
        public Float get(Integer integer) {
        	return null;
        }
        @Override
        public void hi(Float aFloat) {
        }
        @Override
        public void run(Float r1, Float r2, Integer u1, Integer u2) {
        }
    }
    
    class CC implements IUsb {  {
        @Override
        public Object get(Object o) {
        	return null;
        }
        @Override
        public void hi(Object o) {
        }
        @Override
        public void run(Object r1, Object r2, Object u1, Object u2) {
        }
    }
    interface IUsb<U, R> {
        int n = 10;
    
        R get(U u);
        void hi(R r);
        void run(R r1, R r2, U u1, U u2);
    
        default R method(U u) {
        	return null;
        }
    }
    
  • 自定义泛型方法

    • 基本语法

      修饰符<T,R…>返回类型方法名(承诺列表)

    • 注意细节

      1. 泛型方法,可以定义在普通类中,也可以定义在泛型类中

      2. 当泛型方法被调用时,类型会确定

      3. public void eat(E e){},修饰符后没有<T,R…> eat 方法不是泛型方法,而是使用了泛型

        /**
        *泛型注意细节
        */
        public class CustomMethodGeneric {
        	public static void main(String[] args) {
                Car car = new Car();
                car.fly("宝马", 100);
                System.out.println("=======");
                car.fly(300, 100.1);
        
                Fish<String, ArrayList> fish = new Fish<>();
                fish.hello(new ArrayList(), 11.3f);
            }
        }
        
        class Car {
            public void run() {
            }
        
            public <T, R> void fly(T t, R r) {
                System.out.println(t.getClass());
                System.out.println(r.getClass());
            }
        }
        class Fish<T, R> {
            public void run() {
            }
            public<U,M> void eat(U u, M m) {
            }
        
            public void hi(T t) {
            }
        
            public<K> void hello(R r, K k) {
            	System.out.println(r.getClass());
            	System.out.println(k.getClass());
            }
        }
        

泛型的继承和通配符

  • 泛型的继承和通配符说明

    1. 泛型不具备继承性

    2. <?>:支持任意泛型类型
    3. <?extends A>:支持A类以及A类的子类,规定了泛型的上限
    4. <?super A>:支持A类以及A类的父类,不限于直接父类,规定了泛型的下限
      /**
      *泛型的继承
      */
      public class GenericExtends {
          public static void main(String[] args) {
              Object o = new String("xx");
              List<Object> list1 = new ArrayList<>();
              List<String> list2 = new ArrayList<>();
              List<AA> list3 = new ArrayList<>();
              List<BB> list4 = new ArrayList<>();
              List<CC> list5 = new ArrayList<>();
              printCollection1(list1);
              printCollection1(list2);
              printCollection1(list3);
              printCollection1(list4);
              printCollection1(list5);
      
              printCollection2(list3);
              printCollection2(list4);
              printCollection2(list5);
      
              printCollection3(list1);
              printCollection3(list3);
                  }
              public static void printCollection2(List<? extends AA> c) {
              for (Object object : c) {
              	System.out.println(object);
              }
      	}
          public static void printCollection1(List<?> c) {
              for (Object object : c) { 
              	System.out.println(object);
              }
          }
          public static void printCollection3(List<? super AA> c) {
              for (Object object : c) {
                  System.out.println(object);
              }
          }
      }
      class AA {
      }
      class BB extends AA {
      }
      class CC extends BB {
      }
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值