• 泛型


    什么是泛型

    假定我们有这样一个需求:写一个排序方法,能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,该如何实现?
    答案是可以使用 Java 泛型。
    使用 Java 泛型的概念,我们可以写一个泛型方法来对一个对象数组排序。然后,调用该泛型方法来对整型数组、浮点数数组、字符串数组等进行排序。(来自菜鸟教程)

    泛型方法

    1. 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的)。
    2. 每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
    3. 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
    4. 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char的等)。
      示例:
    public class GenericTest{
     public static  <E> void printArray( E[] array){
        for(E element : array){
        System.out.printf("%s",element );
        }
       System.out.println();
       }
       public static void main (String [] args){
       int [] array1={1,2,3};
       double [] array2={1.0,2.0,3.0};
        printArray(array1);
        printArray(array2);
    }
    }
    

    有界的类型参数:
    可能有时候,你会想限制那些被允许传递到一个类型参数的类型种类范围。例如,一个操作数字的方法可能只希望接受Number或者Number子类的实例。这就是有界类型参数的目的。
    要声明一个有界的类型参数,首先列出类型参数的名称,后跟extends关键字,最后紧跟它的上界。

    //求三个Number或他的子类类型对象的最大值
    public  <T extends Comparable<T>> T maximum(T x, T y, T z){
          T max = x; // 假设x是初始最大值
          if ( y.compareTo( max ) > 0 ){
             max = y; //y 更大
          }
          if ( z.compareTo( max ) > 0 ){
             max = z; // 现在 z 更大           
          }
          return max; // 返回最大对象
    }
    

    泛型类

    泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分。
    和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的类型。

    public class Box<T> {
      private T t;
      public void add(T t) {
        this.t = t;
      }
      public T get() {
        return t;
      }
      public static void main(String[] args) {
        Box<Integer> integerBox = new Box<Integer>();
        Box<String> stringBox = new Box<String>();
        integerBox.add(new Integer(10));
        stringBox.add(new String("你好"));
        System.out.printf("整型值为 :%d
    
    ", integerBox.get());
        System.out.printf("字符串为 :%s
    ", stringBox.get());
      }
    }
    

    类型通配符

    1. 类型通配符一般是使用?代替具体的类型参数。例如 List<?> 在逻辑上是List,List 等所有List<具体类型实参>的父类。
    import java.util.*;
     
    public class GenericTest {
         
        public static void main(String[] args) {
            List<String> name = new ArrayList<String>();
            List<Integer> age = new ArrayList<Integer>();
            List<Number> number = new ArrayList<Number>();
            
            name.add("icon");
            age.add(18);
            number.add(314);
     
            getData(name);
            getData(age);
            getData(number);
           
       }
     
       public static void getData(List<?> data) {
          System.out.println("data :" + data.get(0));
       }
    }
    
    1. 类型通配符上限通过形如List<? extends Number>来定义,如此定义就是通配符泛型值接受Number及其下层子类类型。
    2. 类型通配符下限通过形如 List<? super Number>来定义,表示类型只能接受Number及其三层父类类型,如Objec类型的实例。

    以上引自菜鸟教程

  • 相关阅读:
    基于按annotation的hibernate主键生成策略,(本文copy的 七郎's Blog的博客,觉的不错)
    sql server与oracle常用函数对比
    如何将jar包关联到javadoc文档??
    在struts2中,每次修改了struts.xml都要重启tomcat服务器,那么怎么样设置才能修改了struts.xml而不需要重启tomcat的服务器呢??
    单链表的就地逆置
    读书笔记——尽量将引用参数设置为const类型
    二进制中1的个数
    反转单向链表
    二叉树的深度
    C/C++参数入栈顺序
  • 原文地址:https://www.cnblogs.com/jiaorenzhan/p/10623947.html
Copyright © 2020-2023  润新知