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

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

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

在类型参数中使用 super 表示这个泛型中的参数必须是 E 或者 E 的父类。

  1. private <T> void test(List<? super T> dst, List<T> src){ 
  2.     for (T t : src) { 
  3.         dst.add(t); 
  4.     } 
  5.  
  6. public static void main(String[] args) { 
  7.     List<Dog> dogs = new ArrayList<>(); 
  8.     List<Animal> animals = new ArrayList<>(); 
  9.     new Test3().test(animals,dogs); 
  10. // Dog 是 Animal 的子类 
  11. class Dog extends Animal { 
  12.  

dst 类型 “大于等于” src 的类型,这里的“大于等于”是指 dst 表示的范围比 src 要大,因此装得下 dst 的容器也就能装 src 。

? 和 T 的区别

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

?和 T 都表示不确定的类型,区别在于我们可以对 T 进行操作,但是对 ? 不行,比如如下这种 :

  1. // 可以 
  2. T t = operate(); 
  3.  
  4. // 不可以 
  5. ? car = operate(); 

简单总结下:

T 是一个 确定的 类型,通常用于泛型类和泛型方法的定义,?是一个 不确定 的类型,通常用于泛型方法的调用代码和形参,不能用于定义类和泛型方法。

区别1:通过 T 来 确保 泛型参数的一致性

  1. // 通过 T 来 确保 泛型参数的一致性 
  2. public <T extends Number> void 
  3. test(List<T> dest, List<T> src) 
  4.  
  5. //通配符是 不确定的,所以这个方法不能保证两个 List 具有相同的元素类型 
  6. public void 
  7. test(List<? extends Number> dest, List<? extends Number> src) 

像下面的代码中,约定的 T 是 Number 的子类才可以,但是申明时是用的 String ,所以就会飘红报错。

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

不能保证两个 List 具有相同的元素类型的情况

  1. GlmapperGeneric<String> glmapperGeneric = new GlmapperGeneric<>(); 
  2. List<String> dest = new ArrayList<>(); 
  3. List<Number> src = new ArrayList<>(); 
  4. glmapperGeneric.testNon(dest,src); 

上面的代码在编译器并不会报错,但是当进入到 testNon 方法内部操作时(比如赋值),对于 dest 和 src 而言,就还是需要进行类型转换。

区别2:类型参数可以多重限定而通配符不行

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

使用 & 符号设定多重边界(Multi Bounds),指定泛型类型 T 必须是 MultiLimitInterfaceA 和 MultiLimitInterfaceB 的共有子类型,此时变量 t 就具有了所有限定的方法和属性。对于通配符来说,因为它不是一个确定的类型,所以不能进行多重限定。

区别3:通配符可以使用超类限定而类型参数不行

类型参数 T 只具有 一种 类型限定方式:

  1. T extends A 

但是通配符 ? 可以进行 两种限定:

  1. ? extends A 
  2. ? super A 

Class 和 Class 区别

前面介绍了 ? 和 T 的区别,那么对于,Class 和 又有什么区别呢?

Class 和 Class

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

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

热点阅读