关于java泛型T和通配符?的疑问

近期重新复习了泛型和通配符的相关知识,莫名的想到了一个问题:“?”无界通配符的作用在于接收任意的泛型类型,所以我定义了两个方法:1)泛型方法getListAnother() 使用泛型T;2)普通方法getList()使用无界通配符?;两者的作用都是接收包含任意类型的List,并打印类型信息,然后返回这个List。

这两个方法输出一模一样,所以在一定程度上泛型T是可以完全代替无界通配符?的嘛?


```java
import java.util.*;
public class Test {
    public static void main(String[] args) {
        ArrayList<String> strList = new ArrayList<>();
        ArrayList<Integer> intList=new ArrayList<>();
        strList.add("123");
        intList.add(12);
        getList(intList);
        getList(strList);
        getListAnother(intList);
        getListAnother(strList);
    }
    public static List getList(List<?> list){
        System.out.println("? 方法里的?类型是:"+list.get(0).getClass().getName());
        return list;
    }
    public static <T> List getListAnother(List<T> list){
        System.out.println("T 方法里的T类型是:"+list.get(0).getClass().getName());
        return list;
    }
}

输出结果

? 方法里的?类型是:java.lang.Integer
? 方法里的?类型是:java.lang.String
T 方法里的T类型是:java.lang.Integer
T 方法里的T类型是:java.lang.String

https://blog.csdn.net/margin_0px/article/details/82906596 https://blog.csdn.net/margin_0px/article/details/82906596

泛型和通配符最根本的区别就是Java编译器会把泛型【T】推断成具体类型,而把通配符【?】推断成未知类型。Java编辑器只能操作具体类型,不能操作未知类型,如果有对参数做修改的操作就必须要使用泛型,如果仅仅是查看就可以使用通配符

通配符?主要是为了在泛型中起到限制作用的,你用<?>和用<Object>有啥区别

泛型是可以限制参数类型的,有问题的话,编译器就会被拦住的。
通配符只能在运行期识别类型。