加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

Java 中的 T,E,K,V, 别傻傻分不清楚!

发布时间:2019-09-17 03:20:03 所属栏目:优化 来源:glmapper
导读:副标题#e# 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 泛型带来的好处 在没有泛型的情况

本质上这些个都是通配符,没啥区别,只不过是编码时的一种约定俗成的东西。比如上述代码中的 T ,我们可以换成 A-Z 之间的任何一个 字母都可以,并不会影响程序的正常运行,但是如果换成其他的字母代替 T ,在可读性上可能会弱一些。通常情况下,T,E,K,V,? 是这样约定的:

  • ? 表示不确定的 java 类型
  • T (type) 表示具体的一个java类型
  • K V (key value) 分别代表java键值中的Key Value
  • E (element) 代表Element

? 无界通配符

先从一个小例子看起,原文在 这里 。

我有一个父类 Animal 和几个子类,如狗、猫等,现在我需要一个动物的列表,我的第一个想法是像这样的:

  1. List<Animal> listAnimals 

但是老板的想法确实这样的:

  1. List<? extends Animal> listAnimals 

为什么要使用通配符而不是简单的泛型呢?通配符其实在声明局部变量时是没有什么意义的,但是当你为一个方法声明一个参数时,它是非常重要的。

  1. static 
  2.   
  3. int 
  4.  countLegs ( 
  5. List 
  6. <?  
  7. extends 
  8.   
  9. Animal 
  10.  > animals ) { 
  11.  
  12.      
  13. int 
  14.  retVal =  
  15.  
  16.      
  17. for 
  18.  (  
  19. Animal 
  20.  animal : animals ) 
  21.  
  22.     { 
  23.  
  24.         retVal += animal.countLegs(); 
  25.  
  26.     } 
  27.  
  28.      
  29. return 
  30.  retVal; 
  31.  
  32.  
  33.  
  34.  
  35. static 
  36.   
  37. int 
  38.  countLegs1 ( 
  39. List 
  40. <  
  41. Animal 
  42.  > animals ){ 
  43.  
  44.      
  45. int 
  46.  retVal =  
  47.  
  48.      
  49. for 
  50.  (  
  51. Animal 
  52.  animal : animals ) 
  53.  
  54.     { 
  55.  
  56.         retVal += animal.countLegs(); 
  57.  
  58.     } 
  59.  
  60.      
  61. return 
  62.  retVal; 
  63.  
  64.  
  65.  
  66.  
  67. public 
  68.   
  69. static 
  70.   
  71. void 
  72.  main( 
  73. String 
  74. [] args) { 
  75.  
  76.      
  77. List 
  78. Dog 
  79. > dogs =  
  80. new 
  81.   
  82. ArrayList 
  83. <>(); 
  84.  
  85.       
  86. // 不会报错 
  87.  
  88.     countLegs( dogs ); 
  89.  
  90.      
  91. // 报错 
  92.  
  93.     countLegs1(dogs); 
  94.  

当调用 countLegs1 时,就会飘红,提示的错误信息如下:

Java 中的 T,E,K,V, 别傻傻分不清楚!

所以,对于不确定或者不关心实际要操作的类型,可以使用无限制通配符(尖括号里一个问号,即 ),表示可以持有任何类型。像 countLegs 方法中,限定了上届,但是不关心具体类型是什么,所以对于传入的 Animal 的所有子类都可以支持,并且不会报错。而 countLegs1 就不行。

上界通配符 < ? extends E>

上届:用 extends 关键字声明,表示参数化的类型可能是所指定的类型,或者是此类型的子类。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读