首页 > 编程语言 >Java:泛型和通配符的区别

Java:泛型和通配符的区别

时间:2023-11-21 19:34:56浏览次数:32  
标签:listString Java list 通配符 报错 泛型 new List public

一开始我学习通配符的时候,我觉得这个和泛型T不都一样吗?都是表示未确定的类型,有何区别

举一个下面的例子:

@Test
    public void demo1(){
        List<Object> list = null;
        
        List<String> listString = new ArrayList<>();
        List<Double> listDouble = new ArrayList<>();

        list = listString; //编译报错
        list = listDouble; //编译报错
    }

虽然String,Double是Object的子类,但是List< String> 和 List< Double> 可不是 List< Object>的子类,因此编译失败;如果你改成下面这样也是编译失败:

@Test
    public void demo1(){
        List<T> list = null;
        
        List<String> listString = new ArrayList<>();
        List<Double> listDouble = new ArrayList<>();

        list = listString; //编译报错
        list = listDouble; //编译报错
    }

编译器会认为是有个类名字就叫T,所以也报错。但改成通配符就不会了,如下:

@Test
    public void demo1(){
        List<?> list = null;

        List<String> listString = new ArrayList<>();
        List<Double> listDouble = new ArrayList<>();

        list = listString; //编译正常
        list = listDouble; //编译正常
    }

举例二:

public class Demo01<T> {

    @Test
    public void demo1(){
        List<String> listString = new ArrayList<>();
        List<Double> listDouble = new ArrayList<>();

        demo2(listString); //编译报错
        demo2(listDouble); //编译报错
    }


    public void demo2(List<T> list){

    }
}

泛型的确定是由类最先确定,接着才能定下方法的。如果你这样通过方法来确定是会报错的;但改成通配符就没事了:

public void demo2(List<?> list){

}

举例三:
这个是通配符比泛型突出不同的一点,泛型可以是任何类型不加限制,而通配符可限制类型,如下:

public static void getElement1(Collection<? extends Number> coll){}

标签:listString,Java,list,通配符,报错,泛型,new,List,public
From: https://www.cnblogs.com/ibcdwx/p/17847376.html

相关文章

  • java读取.properties文件,通过key获取value
    1.将xx.properties文件放置在src/main/resources/config目录下(config是自己建的目录)2.通过ApplicationHome类获取target路径ApplicationHomeapplicationHome=newApplicationHome(this.getClass());Stringpath=applicationHome.getSource().getParent();3.拼......
  • LeetCode-Java:88合并两个有序数组
    题目:给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1......
  • Java Junit5 使用小结
    在我们的日常开发中,代码一边编码一边自测是常有的事,做好单元测试也是一名开发应该掌握的技能,不说测试搞得多么强,至少会基本的,会功能测试,会性能测试。今天来学习下单元测试。1.JUnit5介绍现在主要版本是JUnit5,所以后面的内容也都是基于JUnit5做相关的介绍。JUnit5是JUnit......
  • JAVA树形结构查询
    1. 2. setDeep查询几层,不固定默认查询全部层 ......
  • 【JAVA基础】事务管理
    @Transactional注解的属性介绍@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class)......
  • JavaWeb01-JDBC学习总结
    为什么需要JDBC?JDBC就是使用Java语言来操作关系型数据库的一套API。市场拥有众多的数据库:MySQL、Oracle、DB2等等。不可能每个数据库都重新开发Java代码来适配不同的数据库,那么Sun公司定义一套标准接口来统一操作数据库。其中所谓的MySQL实现类就是MySQL驱动(驱动Jar包)这样就只需要......
  • JAVA SERVLET踩坑技术
    今天给大家分享一下踩坑记录。今天准备用Servlet重新开发一个web程序。开始是通过实现Servlet今天实现的。@WebServlet("/demo1")publicclassServletDemo1implementsServlet{publicvoidinit(ServletConfigservletConfig)throwsServletException{System.o......
  • Java基础
    Java枚举EnumJava枚举是一个特殊的类,一般表示一组常量Java枚举类使用enum关键字来定义,各个常量使用逗号,来分割。示例enumAnimal{CAT,DOG,BIRD;}publicclassEnumTest{publicvoiddemo(){Animalanimal=Animal.DOG;System.out......
  • JAVA Tips (记录一些常用,容易混乱的小知识)
    记录一些常用,容易混乱的小知识1、Json(JsonNode)判断对应的JsonNode中的数据......
  • Java单列集合Set:HashSet与LinkedHashSet详解,为什么它比List接口更严格?
    上篇我们介绍了单列集合中常用的list接口,本篇我们来聊聊单列集合中的另外一个重要接口Set集合。1、Set介绍java.util.Set接口和java.util.List接口一样,同样实现了Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口......