1.
泛型(generics)的产生
泛型从JDK5引入,目的是将类型参数化
格式:
集合类<类类型> 变量名 = new 集合类<类类型>( );
使用泛型的好处:
a.能够将程序运行时会出现的问题提前到了编译阶段;
b.获取元素的时候不用强制类型转换,避免了无谓的强制类型转换。
使用条件:
当类中操作的引用数据类型不确定的时候就可以使用泛型。
注意:
a.申明好数据类型之后,只能存入相应的数据类型,存入其他类型编译会报错;
b.泛型类型必须是引用类型,基本数据类型必须要转换成相应的包装类;
c.使用泛型之后取数据的时候不需要数据类型转换。
基本类 | 包装类 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
public class FxDemo1{
public static void main(String[] args){
ArrayList<String> arr = new ArrayList<>();
arr.add("wanger");
arr.add("zhangsan");
arr.add("lisi");
//下面编译会报错
arr.add(123);
//取出数据
String str=arr.get(0);
System.out.println(str);
}
}
泛型方法:将类型当作变量来处理,一般用一个任意的大写字母来定义。
格式:
修饰符 <声明自定义泛型> 返回值类型 函数名(形参列表){ }
使用泛型方法,调用者传入某种类型的变量,该函数就返回相应类型的变量。
示例:
import java.util.*;
public class Frdemo2{
//输出数组元素的泛型方法
public static <T> void printArray(T[] inputArray){
for (T arr :inputArray){
System.out.printf("%s",arr);
}
}
public static void main(String args[]){
//创建各种类型数组
Integer[] intarr = {1,2,3,4,5,6};
Double[] doublearr={1.1,2.2,3.3,4.4,5.5,6.6};
Character[] chararr={'A','B','C','D','E','F'};
System.out.println("依次输出数组元素:");
printArray(intarr);
System.out.println(" ");
printArray(doublearr);
System.out.println(" ");
printArray(intarr);
}
}
泛型类:
格式:
修饰符 class 类名<泛型>{ }
注意:静态方法不可以使用类中定义的泛型。
因为类中的泛型需要在对象初始化时指定具体的类型,而静态优先于对象存在。那么在类中的静态方法就需要单独进行泛型声明,声明泛型在static之后,返回值类型之前。
import java.util.*;
public class Frdemo<T> {
private T t;
public void add(T t) {
this.t = t;
}
public T get() {
return t;
}
public static void main(String[] args) {
Frdemox<Integer> integerFrdemo= new Frdemo<Integer>();
Frdemo<String> stringFrdemo = new Frdemo<String>();
integerFrdemo.add(new Integer(1));
stringFrdemo.add(new String("shishi"));
System.out.printf("整型值为 :%d\n\n", integerFrdemo.get());
System.out.printf("字符串为 :%s\n", stringFrdemo.get());
}
}
泛型接口
格式:
interface 接口名<声明自定义的泛型>
注:
1.在接口上自定义泛型的具体数据类型是在实现该接口的时候指定的。
2.如果一个接口自定义了泛型,在实现该接口的时候没有指定具体的数据类型,那么默认是Object数据类型。