泛型的实现方式
1. 什么是泛型?
Java 泛型(Generics) 是 JDK 5 中引入的一个新特性。使用泛型参数,可以增强代码的可读性以及稳定性。
编译器可以对泛型参数进行检测,并且通过泛型参数可以指定传入的对象类型。
比如:
ArrayList<Person> persons = new ArrayList<Person>()
这行代码就指明了该 ArrayList
对象只能传入 Person
对象,如果传入其他类型的对象就会报错。
例如: 是Book 类型的对象就会报错
ArrayList<Person> persons = new ArrayList<Book>()
并且,原生 List
返回类型是 Object
,需要手动转换类型才能使用,使用泛型后编译器自动转换。
2.泛型有哪几种方式?
泛型一般又有三种使用方式:泛型类、泛型接口、泛型方法。
1.泛型类:
类型参数用于类的定义中,则该类被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种容器类,如:List、Set、Map等。
泛型类的基本语法如下:
class 类名称 <泛型标识> {
private 泛型标识 /*(成员变量类型)*/ 变量名;
.....}
}
例如:
//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
//在实例化泛型类时,必须指定T的具体类型
public class Generic<T>{
private T key;
public Generic(T key) {
this.key = key;
}
public T getKey(){
return key;
}
}
如何实例化泛型类:
Generic<Integer> genericInteger = new Generic<Integer>(666);
2.泛型接口:
泛型接口和泛型类的定义差不多,基本语法如下:
public interface 接口名<类型参数> {
...
}
使用泛型接口需注意:泛型接口中的类型参数,在该接口被继承或者被实现时确定
例如:
public interface Book<T> {
public T method();
}
实现泛型接口又有两种方式:
1.实现泛型接口,不指定类型:
class Book<T> implements Book<T>{
@Override
public T method() {
return null;
}
}
2.实现泛型接口,指定类型:
class GeneratorImpl implements Generator<String> {
@Override
public String method() {
return "hello";
}
}
3.泛型方法:
当在一个方法签名中的返回值前面声明了一个 < T > 时,该方法就被声明为一个
泛型方法
。< T >表明该方法声明了一个类型参数 T,并且这个类型参数 T 只能在该方法中使用。当然,泛型方法中也可以使用泛型类中定义的泛型参数
。
并且 只有在方法签名中声明了< T >的方法才是泛型方法,仅使用了泛型类定义的类型参数的方法并不是泛型方法。
public static < E > void printArray( E[] inputArray )
{
for ( E element : inputArray ){
System.out.printf( "%s ", element );
}
System.out.println();
}
使用:
// 创建不同类型数组:Integer, Double 和 Character
Integer[] intArray = { 1, 2, 3 };
String[] stringArray = { "Hello", "World" };
printArray( intArray );
printArray( stringArray );
2. 注意:
public static < T > void printArray( T[] inputArray )
一般被称为静态泛型方法 ;在 java 中泛型只是一个占位符,必须在传递类型后才能使用。类在实例化时才能真正的传递类型参数,由于静态方法的加载先于类的实例化,也就是说类中的泛型还没有传递真正的类型参数,静态的方法的加载就已经完成了,所以静态泛型方法是没有办法使用类上声明的泛型的。只能使用自己声明的<T>
泛型方法签名中声明的类型参数只能在该方法里使用,而泛型接口、泛型类中声明的类型参数则可以在整个接口、类中使用。
当调用泛型方法时,根据外部传入的实际对象的数据类型,编译器
就可以判断出类型参数 T
所代表的具体数据类型。
4.总结:
泛型使编译器 可以在编译期间对类型进行检查以提高类型安全,减少运行时由于对象类型不匹配引发的异常,泛型也提高了程序代码的可读性。
原文地址:https://blog.csdn.net/whs_8792/article/details/142771148
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!