java泛型
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。规范的泛型定义一般是一个大写的任意字母。
泛型只在编译时起作用,在编译过程中如果正确检验了泛型结果后,会将泛型信息清除。
泛型出现的原因:通过定义泛型可以避免了很多的类型转换,将潜在的运行时异常提前暴露在编译时期。如集合可以存储任意类型的对象,但是要想使用对象特定的方法就需要进行类型转换,如果集合中存入的对象不同,有可能引发类型转换异常。
泛型类使用场合:当类中操作的引用数据类型不确定的时候,就可以使用泛型类。
泛型使用需注意的细节:
1.声明好泛型类型之后,集合中只能存放特定类型元素
2.泛型必须是引用类型,基本数据类型使用其包装类。
3.使用泛型后取出元素不需要类型转换.
4.译器编译完带有泛形的java程序后,生成的class文件中将不再带有泛形信息。
泛型方法:
1.使用泛型方法前需要进行泛型声明,使用一对尖括号 <泛型>,声明的位置在static后返回值类型前。
2.当一个类中有多个函数声明了泛型,那么该泛型的声明可以声明在类上。
泛型类:
1.使用泛型类,创建对象的时候需要指定具体的类型
2.静态方法不可以使用类中定义的泛型,要使用泛型需自己定义
泛型类细节:
1、创建对象的时候要指定泛型的具体类型
2、创建对象时可以不指定泛型的具体类型(和创建集合对象一眼)。默认是Object,例如我们使用集合存储元素的时候没有使用泛型就是那么参数的类型就是Object
3、类上面声明的泛型只能应用于非静态成员函数,如果静态函数需要使用泛型,那么
需要在函数上独立声明。
4、如果建立对象后指定了泛型的具体类型,那么该对象操作方法时,这些方法只能操作一种数据类型。
5、所以既可以在类上的泛型声明,也可以在同时在该类的方法中声明泛型。
泛型通配符:可以看作任何泛型,由于泛型是无法像面向对象的多态一样进行类型转换,所以通配符泛型可以设置泛型类型的范围。
?extends E: 接收E类型或者E的子类型。
? super E: 接收E类型或者E的父类型。
简单泛型代码列子:
public class Generic<T>{
private T key;
public T getKey() {
return key;
}
public void setKey(T key) {
this.key = key;
}
public static <E> E doSomeThing(E e){
return e;
}
public <K> void doSomeThing2(K k){
}
public static void main(String[] args) {
Generic<String> gen = new Generic<>();
gen.setKey("kyle");
System.out.println(gen.getKey());
System.out.println(doSomeThing(2));
}
}
使用定义的泛型类时并不一定需要传入泛型实参,只有传入了泛型实参泛型的约束作用才会起作用。