java学习----泛型

目录

  1.泛型的定义

  2.泛型的使用

   3.泛型通配符

一、泛型的定义

  泛型是java5的新特性,使用泛型会让程序编写简单安全,在编译的时候就会检查类型是否安全

  定义:所谓泛型就是允许在定义类、接口和方法使用参数类型这个类型形参可以在声明变量、

创建对象、调用方法时动态指定(类型实参)泛型的参数类型只能是引用类型,不能是基本类型

  

二、泛型的使用

  1.泛型接口

    泛型接口格式:

      修饰符 interface 接口名<T...>{}

      泛型接口Demo:

public interface Action<E> {
    //在接口中使用泛型E
    E getE();
    //在接口中使用泛型抽象方法
    <T> T getT(int i);
}

  2.泛型类

    泛型类格式:

      修饰符  class 类名<T...>{

      使用T; }    

        泛型类Demo:

//类上声明泛型E
public class ActionImpl<E>{
    //声明E类型变量
    private E e;
    //使用E类型
    public E getE() {
        // TODO Auto-generated method stub
        return e;
    }
    public ActionImpl(E e){
        this.e = e ;
    }
    
}

  3.泛型方法

    泛型方法格式:

      修饰符<T...> 返回值 方法名 (参数列表){

        使用T; }

        泛型方法Demo:

public class GenericWay {
    //方法上声明泛型T类型
    public static <T> T get(T t){
        return t;
    }
}

三、泛型通配符

  泛型通配符的符号是?

  普通的泛型与泛型通配符的泛型Class<T>与Class<?>的区别在于:

  Class<T> :在实例化的时候,T需要替换成具体的类型
  在泛型类、方法中可以使用T,还可以操作T类型的变量

  Class<?>:他是通配符,?可以表示任何类型(使用了泛型)

  泛型通配符可以匹配任意类型。

  泛型通配符Demo:

  

import java.util.ArrayList;
import java.util.List;

public class GWC {
    //参数是list,list里的类型可以是任意类型
    public void forList(List<?> l){
        for (Object object : l) {
            System.out.println(object);
        }
    } 
    public static void main(String[] args) {
        GWC gwc = new GWC();
        List<Integer> l1 = new ArrayList<>();
        l1.add(1);
        l1.add(2);
        gwc.forList(l1);
        List<String> l2 = new ArrayList<>();
        l2.add("1");
        l2.add("2");
        gwc.forList(l2);
    }
}

    通配符上限

     举个栗子:

        List<? extends Number>  这么声明的数只能是number类型或number类型的子类

      通配符上限Demo:

        

import java.util.ArrayList;
import java.util.List;

public class GWCTop {
    public void forList(List<? extends Number> l){
        for (Number number : l) {
            System.out.println(number);
        }
    }
    
    public static void main(String[] args) {
        GWCTop gwcTop = new GWCTop();
        //Object 类型是number类型的父类编译报错;
        //List<Object> list = new ArrayList<>();
        //String 类型不是number编译器报错;
        //List<String> list = new ArrayList<>();
        List<Number> list = new ArrayList<>();
        gwcTop.forList(list);
    }
}

    通配符下限

      举个栗子:

        List<? super Number> 这么声明的数只能是number类型或number类型的父类

        通配符下限Demo:

import java.util.ArrayList;
import java.util.List;

public class GWCUnder {
    public void forList(List<? super Number> l){
        for (Object object : l) {
            System.out.println(object);
        }
    }
    public static void main(String[] args) {
        GWCUnder gwcUnder = new GWCUnder();
        //Integer 类型是Number类型的父类,编译不通过;
        //List<Integer> list = new ArrayList<>();
        //String 类型不是Number类型的父类,编译不通过;
        //List<String> list = new ArrayList<>();
        List<Object> list = new ArrayList<>();
        gwcUnder.forList(list);
    }
}
原文地址:https://www.cnblogs.com/bananafish/p/9825704.html