你真的了解JAVA中的泛型E、T、K、V吗?

Python038

你真的了解JAVA中的泛型E、T、K、V吗?,第1张

Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

在没有泛型的情况的下,通过对类型 Object 的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是本身就是一个安全隐患。

那么泛型的好处就是在编译的时候能够检查类型安全,并且所有的强制转换都是自动和隐式的。本质上T,E,K,V都是通配符,没啥区别,只不过是编码时的一种约定俗成的东西。比如上述代码中的 T ,我们可以换成 A-Z 之间的任何一个 字母都可以,并不会影响程序的正常运行。

但是如果换成其他的字母代替 T ,在可读性上可能会弱一些。通常情况下,T,E,K,V,?是这样约定的:?表示不确定的 java 类型。T (type) 表示具体的一个java类型。K V (key value) 分别代表java键值中的Key Value。E (element) 代表Element。

1.Java在jdk1.6之后引入了泛型,用E来表示任意类型:

比如 HashMap<K,V>

用的时候 你可以将K,V 设置成任意类

HashMap<String,Integer>K,V 和那个E 一样

HashMap<String,Integer>这表示一个类 这个类有两个子变量类型是 String Integer

2.还可能是异常处理的一个参数e,try{}catch(Exception e){e.printStackTrace()}

e是(Exception e)里传的参数,是实例化异常的一个对象

e.printStackTrace()就是打印异常信息

如果(Exception e)改成了(Exception exce)的话,那后面调用方法的时候就是exce.printStackTrace()

有些人的用复制数列,算法低效、粗野浪费。

给你个、 高效、简洁而且泛型通用的全组合:

public class Test{

public static void main(String[] args) {

String[] a = { "A", "B", "C", "D", "E" }

for(int i=1i<=a.lengthi++){

System.out.println(a.length+"选"+i)

String[] res=new String[i]

combine(a,0,res,0)

}

}

final static public void combine(final Object a[], final int a_pos,final Object rs[], final int rs_pos)

{

if(rs_pos>=rs.length){

for(int i=0i<rs.lengthi++) System.out.print(rs[i]+" ")

System.out.println()

}else for(int ap=a_posap<a.lengthap++){

rs[rs_pos]=a[ap]combine(a,ap+1,rs,rs_pos+1)

}

}

}

=======

5选1

A

B

C

D

E

5选2

A B

A C

A D

A E

B C

B D

B E

C D

C E

D E

5选3

A B C

A B D

A B E

A C D

A C E

A D E

B C D

B C E

B D E

C D E

5选4

A B C D

A B C E

A B D E

A C D E

B C D E

5选5

A B C D E