Java泛型

简介:

        我们可以写一个泛型方法来对一个对象数组排序。然后,调用该泛型方法来对整型数组、浮点数数组、字符串数组等进行排序。简单来说,就是当我们写一个方法的时候,无法确定入参是什么类型的时候,就可以使用泛型。

泛型使用规则:

  1. 所有泛型方法声明都有一个类型参数声明部分,该声明在方法返回类型之前。
  2. 每一个类型声明参数部分都可以声明一个或多个类型
  3. 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
  4. 类型参数只能代表引用类型。

有界类型参数:

    在某些特定的场合,你需要限制一个传递到一个参数类型的类型种类范围。

    要声明一个有界的类型参数,首先列出类型参数的名称,后跟extends关键字,最后紧跟它的上界。

package com.Enumeration;
 2 public class Test<T> {
 3     private T t;
 4     public T getT() {
 5         return t;
 6     }
 7     public void setT(T t) {
 8         this.t = t;
 9     }
10     public <U extends Number> void print(U u) {
11         System.out.println("T:"+t.getClass().getName());
12         System.out.println("U:"+u.getClass().getName());        
13     }
14     public static void main(String[] args) {
15         Test<Integer> test = new Test<Integer>();
16         test.setT(new Integer(10));
17         test.print("some text"); //这一行回报错:边界不匹配:类型 Test<T> 的通用方法 print(U)不适用于参数(String)。推断类型 String 并不是有界参数 <U 到 Number> 的有效替代项。
18     }

泛型类:

    泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分(如上例子所示)。

类型通配符:

    类型通配符一般是使用?代替具体的类型参数。例如 List<?> 在逻辑上是List<String>,List<Integer> 等所有List<具体类型实参>的父类。例:

 

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test {
    public static void main(String[] args) {
        List<String> str = new ArrayList<String>();  //String 类型
        List<Integer> in = new ArrayList<Integer>(); //Integer类型
        str.add("富强");
        str.add("民主");
        str.add("文明");
        in.add(0);
        in.add(1);    
        pring(str);
        pring(in);
    }
    public static void pring(List<?> list){  //类型通配符
         Iterator<?> ite=list.iterator();
         while(ite.hasNext()){
             System.out.println(list.getClass().getName()+":"+ite.next());
         }
     }
}

         输出结果为:

    

 

    类型通配符也有限制,和泛型一样,用extends设置上界。

特别注意:

  1. <? extends T>和<? super T>的区别:前者标识通配符代表的是T类型以及T类型的子类型;后者标识T类型以及T类型的父类。
  2. 待补充...
posted @ 2019-06-13 16:45  不是山谷  阅读(257)  评论(0编辑  收藏  举报