java中泛型 T 与 ? 的区别

Posted 老周聊架构

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中泛型 T 与 ? 的区别相关的知识,希望对你有一定的参考价值。

T表示泛型,new的时候要加入泛型,更方便通用
? 表示不确定的类型,一般用在通配

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

下面介绍一个小demo

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

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

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

    

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

    

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

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

创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖

以上是关于java中泛型 T 与 ? 的区别的主要内容,如果未能解决你的问题,请参考以下文章

Java泛型中T和问号(通配符)的区别

java中泛型的k t v e 分别代表啥

Java中泛型得到T.class

Java中泛型区别以及泛型擦除详解

java中泛型List问题

java中E,T,?的区别?