泛型是什么?
我们可以将泛型看成一个参数,它的出现确定了一个类在使用时该数据的类型,也就是说当我们不确定传入的参数类型时我们可以考虑泛型
为什么要用泛型?
举个最常见的例子;当我们用某个类的方法时我们不确定传入的参数类型的话我们只能用Object去接受,比如传入的类型时String类型,此时他就会自动装箱
,但是如果我们想将它转换成Integer的话就会报类型转换异常因为String是不能转换为Integer的,这时候我们就需要用到泛型技术以确保传入的类型一致
举个例子
没有使用泛型
public class FanXingTest {
public static void main(String[] args) {
Test2 test2 = new Test2();
test2.setter(123,"ddd");
int i = (Integer) test2.o2;
System.out.println(test2.o2);//报错 类型转换异常 java.lang.String cannot be cast to java.lang.Integer
}
}
class Test2{
Object o1;
Object o2;
public void setter(Object o1, Object o2){
this.o1 = o1;
this.o2 = o2;
}
使用泛型
public class FanXingTest {
public static void main(String[] args) {
Test2<String,Integer> test2 = new Test2();
//当传入的参数不对时会报错
//test2.setter(16,"小明") 报错!
test2.setter("小明",16);
System.out.println(test2.o1+"今年"+test2.o2+"岁");///小明今年16岁
}
}
//E1 E2确定了传入数据的类型
class Test2 <E1,E2>{
Object o1;
Object o2;
public void setter(E1 e1, E2 e2){
this.o1 = e1;
this.o2 = e2;
}
注;泛型类必须是类,如果要用到的类型是基本数据类型那必须要用包装类转换
如果new对象时没有声明泛型类型则默认为Object
泛型的使用事项;
泛型类是可以有多个参数的,此时可以将多个参数一起放到“< >”内.
实例化后泛型指定的位置的类型参数必须与传入类型一致。
同一个类如果泛型参数不同不能相互赋值
new的对象时没有指定泛型类型,默认Object
在接口或类中声明的泛型,在自己的静态方法中不能使用(泛型类型是new时确定的,晚于静态方法)
异常类不能是泛型的
父类如果存在泛型,子类可以自行决定是否保留父类的泛型
//同一个类如果泛型参数不同不能相互赋值
public class FanXingTest {
public static void main(String[] args) {
ArrayList<Integer> arr1 = new ArrayList<>();
ArrayList<String> arr2 = new ArrayList<>();
//arr1 = arr2;//报错
}
}
泛型方法;泛型方法中的泛型类型和所在类指定的泛型类型没有关系,也就是说,泛型方法中的泛型类型是和所在类指定的泛型类型不同的
public class FanXingTest {
public static void main(String[] args) {
String [] str = {"a","b","c","d"};
TestMethond<Integer> tm1 = new TestMethond<>();
List<String> list = tm1.Test2(str);
System.out.println(list);//[a, b, c, d]
}
}
class TestMethond<E>{
//此时的T与所在类的E没有关系
public <T> List<T> Test2(T[] arr){
ArrayList<T> list = new ArrayList<>();
for(T t: arr){
list.add(t);
}
return list;
}
}
泛型方法可以声明为静态的,因为泛型方法中的泛型类型是在调用方法时确定的,不是在创建类时确定
public class FanXingTest {
public static void main(String[] args) {
Integer [] i = {1,2,3,4,5};
List<Integer> list1 = TestMethond.Test3(i);
System.out.println(list1);
}
}
class TestMethond<E>{
public static <O> List<O> Test3(O[] arr){
ArrayList<O> list = new ArrayList<>();
for(O o : arr){
list.add(o);
}
return list;
}