java泛型-和T的区别,

  java泛型?和T的区别,

  通用占位符t和?有什么区别?这是一个很好的问题,有些人可能想不通,这里简单演示一下。相信大家都能想明白!

  前两个代码:

  公共静态T void show 1(ListT list){ for(Object Object : list){ system . out . println(Object . tostring());} }公共静态void show2(List?list){ for(Object Object : list){ system . out . println(Object);}}你可以看到我们在show1方法中使用了T。大家都知道这是编写泛型的常用方法,所以这里的T指的是一种特定的对象。列表集合中只能存储相同类型的数据,如果插入不同类型的数据,将会报告错误。

  那么我们在show2方法中使用了什么呢?可以看到void前面没有t。可以表示为一个占位符,它不知道列表集合中会存储多少种类型的数据,所以说明我们的列表中也可以存储N种数据类型。

  让我们通过一个测试代码直观感受一下两者的区别:

  public static void test(){ list student list 1=new ArrayList();list1.add(新生(张三,18,0));list1.add(新生( lisi ,28,0));list1.add(新生(吴王,24,1));//这里如果添加(新老师(.));您将报告一个错误,因为我们已经为列表指定了Student show1(list1)的数据类型;system . out . println( * * * * * * * * * * * *分割线* * * * * * * * * * *);//这里不为列表指定具体的数据类型,可以存储多种类型的数据列表List 2=new ArrayList();list2.add(新生(刘钊,22,1));list2.add(新老师(孙霸,30,0));show 2(list 2);}看看运行结果:

  学生{姓名=张三,年龄=18,性别=0 }学生{姓名=李四,年龄=28,性别=0 }学生{姓名=吴王,年龄=24,性别=1} * * * * * * * * * * * *分割线* * * * * * * * * * *学生{姓名=赵丽,年龄=22,性别=1 }老师{姓名=孙八,年龄=30

  可以看出show2方法和show1方法的区别。list2存储了两种类型,学生和老师,也可以输出数据,所以这是T和?有什么区别~你的朋友们懂吗?

  让我们来看看?以下内容的扩展书写:

  列表?扩展数据类型列表

  public static void show3(List?扩展教师列表){ for(Object Object : list){ system . out . println(Object);} }列表?扩展教师列表意味着您可以接收教师及其子类数据类型的列表集,并编写一个测试方法show 3(list 2);尝试:

  学生{name=刘钊,年龄=22,性别=1}老师{name=孙巴,年龄=30,性别=0}可以看到正常输出,因为集合中的所有数据都是老师的子类类型。如果我们列出来?扩展教师列表更改为列表?扩展学生列表会发生什么变化?

  仔细看看这个图,我们已经创建了一个新的list3,并将数据类型声明为Teacher。这时我们调用show3(List?扩展学生列表)将立即报告错误。错误信息表示不能将教师转换为学生,因为学生是教师的子类,我们只接受学生及其子类,所以当然会报错。

  列表?超级数据类型列表

  这种编写方式意味着只接收指定的数据类型及其父类类型,编写一段代码来查看效果也很简单:

  public static void show4(List?超级学生列表){ for(Object Object : list){ system . out . println(Object);}}如您所见,我们收到的是Student及其父类的集合。我们写两组数据,然后调用并尝试。

  list list 4=new ArrayList();list4.add(新生(孙霸,30,0));list4.add(新老师(刘钊,22,1));show 4(list 4);在列表中插入一个学生和教师对象,并查看结果:

  学生{name= sunba ,年龄=30,性别=0}老师{name=刘钊,年龄=22,性别=1}没问题,正常运行,输出。

  让我们看看如果我们是passed Student的子类集合会发生什么。

  您可以看到,和以前一样,您将出于同样的原因报告一个错误,因为我们已经定义了只能接收Student及其父类的数据类型。

  最后,我们来看一个情况。

  如果我在定义列表时没有指定数据类型,并插入了一个孩子、学生、教师或名为show4(List?超级学生名单),会报错吗?不会报告任何错误。运行结果会怎样?

  可以看出这样做没有错误,因为list可以存储多种数据类型,那么调用show4方法会发生什么情况呢?

  可以看到程序正常运行并输出结果。注意,我们接收Student及其父类对象的数据类型。因为我们的孩子继承自Student,所以程序自动将我们的孩子转换为父类Student进行输出。所以大家要注意这一点,它会自动向上转换。

  00-1010相信你看完这个就再也不会混淆两者的区别了。他们很容易想通,这些事情一旦想通就不会忘记。

  这篇关于占位符T java的文章?这里的文章有什么区别?更多相关java通用占位符T和?请搜索以前关于流行它的文章或继续浏览下面的相关文章。我希望你能支持在未来盛行它!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: