加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

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

发布时间:2019-09-17 02:10:33 所属栏目:优化 来源:glmapper
导读:前言 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. 0 
  16. ; 
  17.  
  18.      
  19. for 
  20.  (  
  21. Animal 
  22.  animal : animals ) 
  23.  
  24.     { 
  25.  
  26.         retVal += animal.countLegs(); 
  27.  
  28.     } 
  29.  
  30.      
  31. return 
  32.  retVal; 
  33.  
  34. } 
  35.  
  36.  
  37.  
  38. static 
  39.   
  40. int 
  41.  countLegs1 ( 
  42. List 
  43. <  
  44. Animal 
  45.  > animals ){ 
  46.  
  47.      
  48. int 
  49.  retVal =  
  50. 0 
  51. ; 
  52.  
  53.      
  54. for 
  55.  (  
  56. Animal 
  57.  animal : animals ) 
  58.  
  59.     { 
  60.  
  61.         retVal += animal.countLegs(); 
  62.  
  63.     } 
  64.  
  65.      
  66. return 
  67.  retVal; 
  68.  
  69. } 
  70.  
  71.  
  72.  
  73. public 
  74.   
  75. static 
  76.   
  77. void 
  78.  main( 
  79. String 
  80. [] args) { 
  81.  
  82.      
  83. List 
  84. < 
  85. Dog 
  86. > dogs =  
  87. new 
  88.   
  89. ArrayList 
  90. <>(); 
  91.  
  92.       
  93. // 不会报错 
  94.  
  95.     countLegs( dogs ); 
  96.  
  97.      
  98. // 报错 
  99.  
  100.     countLegs1(dogs); 
  101.  
  102. } 

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

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

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

上界通配符 < ? extends E>

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

(编辑:衡阳站长网)

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

热点阅读