java泛型:T与?的使用及区别

T表示泛型,new的时候要加入泛型,更方便通用
? 表示不确定的类型,一般用在通配
Object表示java中所有类的父类,在集合中使用时要格外注意。
jdk为了便于理解,用K表示键,V表示值,T表示type类型,E表示enum枚举,其实这四个都只是符号,都是表示泛型名称。换成其他字母都没关系,但是都要在之前声明。

下面介绍一个例子:

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

//虽然Test,但类名字仍为Test。T1,T2只是告诉我们new的时候要加入泛型,更方便通用
//T1,T2可以任意定义,比如改成K,V都可以
//他们不会关联到其他类,只是在本类中通用
public class Test {
    public static void main(String[] args) {
        System.out.println(new Test().getT1());
        System.out.println(new Test().getT2());
        new Test().getClassName("");//T1,T2在new的时候用到,这里都为String
        new Test().getClassAndList(Integer.class);
        //HashMap的括号里面不能是T,E,T1,T2等不确定的东西,但可以是?
        HashMap map = new HashMap();
        List list = new ArrayList();
    }

    public T1 getT1() {
        //这里的“T1”替换成1或1.0都会报错
        return (T1) "T1";

    }

    T2 getT2() {
        //将自动转型为String
        return (T2) "T2";

    }

    public  void getClassName(T x) {
        //必须放在void或者返回类型的前面
        System.out.println(x.getClass().getName());
    }

    public  Class getClassAndList(Class a) {
        //Class前面缺少必须定义,否则将出现编译错误
        //T改成其他字母都可以,但一定要声明
        // 返回类型和参数中的类型:Class和Class都可以。因为返回的a的类型为Class,Class可以通配
        //当两个都是Class,参数中的?自动通配成T
        System.out.println(a.getClass().getName());//传入的a是一个类,Class类型
        //参数里面的Class最大的好处是如果方法里面定义了泛型,可以自动获取类型值,比如如下的List可以自动获取到a的类型,不必强调死
        List aa = new ArrayList();
        //List aa = new ArrayList();会报错,以为ArrayList必须是一种类型,List<>起到通配的作用
        //List aa = new ArrayList();当然正确
        System.out.println(aa);
        return a;
    }
}

你可能感兴趣的:(java)