泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。
java中的泛型
泛型:泛型是jdk1.5出现的新特性。
泛型是针对引用类型来使用的。
泛型的好处:
1. 将运行时出现的问题提前至了编译时。
2. 避免了无谓强制类型转换。
自定义泛型: 自定义泛型就是一个数据类型的占位符或者理解为一个数据类型的变量。
泛型方法
定义格式:
修饰符 <声明自定义的泛型>返回值类型 函数名(自定义的泛型 变量名..)
代码示例如下:
1 public class TestType { 2 public static void main(String[] args) { 3 String str = "张三"; 4 Integer num = 123; 5 System.out.println("返回字符串:"+getData(str)); 6 System.out.println("返回数字类型:"+getData(num)); 7 8 } 9 //定义一个方法可以接收任意类型的参数,而且返回值类型必须 要与实参的类型一致。 10 public static <E>E getData(E element) { 11 return element; 12 } 13 14 }
泛型方法要注意的事项:
1. 泛型方法中的自定义泛型的具体数据类型是在调用该函数的时候传入实参时确定的。
2. 自定义泛型所用的标识符只要符合标识符的命名规则即可。但是我们一般都习惯使用一个大写字母T(Type)或者E(Element)来表示。
泛型类
泛型类的定义格式
class 类名<声明自定义的泛型>{
}
代码示例如下:
1 class MyArrays<T>{ 2 //翻转数组中的元素 3 public void reverse(T[] array) { 4 for (int startIndex = 0,endIndex = array.length-1; startIndex<endIndex; startIndex++,endIndex--) { 5 T temp = array[startIndex]; 6 array[startIndex] = array[endIndex]; 7 array[endIndex] = temp; 8 } 9 } 10 11 //转化为字符串 12 public static <T>String toString(T[] array) { 13 StringBuilder stringBuilder = new StringBuilder(); 14 for (int i = 0; i < array.length; i++) { 15 if (i==0) { 16 stringBuilder.append("["+array[i]+",") ; 17 }else if (i==array.length-1) { 18 stringBuilder.append(array[i]+"]") ; 19 }else{ 20 stringBuilder.append(array[i]+",") ; 21 } 22 } 23 return stringBuilder.toString(); 24 } 25 } 26 27 public class TestType { 28 public static void main(String[] args) { 29 //泛型类 30 String[] strArray = {"张三","李四","王五"}; 31 MyArrays<String> tool = new MyArrays<String>(); 32 tool.reverse(strArray); 33 System.out.println(MyArrays.toString(strArray)); 34 35 Integer[] numArray = {1,2,3,4}; 36 String numStr = MyArrays.toString(numArray); 37 System.out.println(numStr); 38 39 }
泛型类要注意的事项:
1. 泛型类上的自定义泛型是在使用该类创建对象的时候指定具体的数据类型的。
2. 如果一个类已经自定义了泛型,使用该类创建对象的时候如果没有指定泛型的具体数据类型,那么默认为Object类型。
3. 静态的函数不能使用类上自定义的泛型,如果静态函数需要使用,必须要在函数上自定义泛型。
泛型接口
泛型接口的定义格式:
interface 接口名<声明自定义的泛型>{
}
代码示例:
1 interface Array<T>{ 2 public void reverse(T[] array); 3 } 4 class MyArrays implements Array<String>{ 5 //翻转数组中的元素 6 public void reverse(String[] array) { 7 for (int startIndex = 0,endIndex = array.length-1; startIndex<endIndex; startIndex++,endIndex--) { 8 String temp = array[startIndex]; 9 array[startIndex] = array[endIndex]; 10 array[endIndex] = temp; 11 } 12 } 13 14 //转化为字符串 15 public static <T>String toString(T[] array) { 16 StringBuilder stringBuilder = new StringBuilder(); 17 for (int i = 0; i < array.length; i++) { 18 if (i==0) { 19 stringBuilder.append("["+array[i]+",") ; 20 }else if (i==array.length-1) { 21 stringBuilder.append(array[i]+"]") ; 22 }else{ 23 stringBuilder.append(array[i]+",") ; 24 } 25 } 26 return stringBuilder.toString(); 27 } 28 } 29 30 public class TestType { 31 public static void main(String[] args) { 32 //泛型类 33 String[] strArray = {"张三","李四","王五"}; 34 MyArrays tool = new MyArrays(); 35 tool.reverse(strArray); 36 System.out.println(MyArrays.toString(strArray)); 37 38 }
泛型接口要注意事项:
1. 泛型接口上的自定义泛型是在实现该接口的时候指定具体数据类型的。
2. 如果实现接口的时候没有指定接口上的自定义泛型的具体数据类型,那么默认为Object数据类型。
3. 如果需要在创建接口实现类对象的时候才指定接口上自定义泛型,那么需要以下格式:
class<T> 类名 implements 接口<T>
代码示例如下:
1 interface Array<T>{ 2 public void reverse(T[] array); 3 } 4 class MyArrays<T> implements Array<T>{ 5 //翻转数组中的元素 6 public void reverse(T[] array) { 7 for (int startIndex = 0,endIndex = array.length-1; startIndex<endIndex; startIndex++,endIndex--) { 8 T temp = array[startIndex]; 9 array[startIndex] = array[endIndex]; 10 array[endIndex] = temp; 11 } 12 } 13 14 //转化为字符串 15 public static <T>String toString(T[] array) { 16 StringBuilder stringBuilder = new StringBuilder(); 17 for (int i = 0; i < array.length; i++) { 18 if (i==0) { 19 stringBuilder.append("["+array[i]+",") ; 20 }else if (i==array.length-1) { 21 stringBuilder.append(array[i]+"]") ; 22 }else{ 23 stringBuilder.append(array[i]+",") ; 24 } 25 } 26 return stringBuilder.toString(); 27 } 28 } 29 30 public class TestType { 31 public static void main(String[] args) { 32 //泛型类 33 String[] strArray = {"张三","李四","王五"}; 34 MyArrays<String> tool = new MyArrays<String>(); 35 tool.reverse(strArray); 36 System.out.println(MyArrays.toString(strArray)); 37 }
泛型上下限
?为通配符
? super Integer 允许是Integer数据类型或者是Integer父类类型 泛型的下限
? extedns Number 允许是Number数据类型或者是Number子类的数据类型 泛型的上限。