自定义泛型方法
-
规则:
- 1.定义一个类型,使用大写字母表示:这个大写字母的类型表示任意的类型
- 2.如:这个大写字母为T,写在返回值之前,void之前写 < T >
- 3.接下来就可以使用T类型了
- 4.在泛型里面写的是一个对象,不能写基本的数据类型,应写其对应的包装类
- 5.只有对象类型才能作为泛型方法的实际参数
泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。但编译器编译完带有泛型的java程序后,生成的class文件中将不再带有泛型信息,以此使程序运行效率不受影响,这个过程称之为"擦除"。
例如:自定义一个对调一个数组中任意两个元素的位置的方法:genericTurn()
public class MyGeneric {
//自定义泛型返回
public static <T> void genericTurn(T[] t,int a,int b) {
T temp=t[a];
t[a]=t[b];
t[b]=temp;
}
}
单元测试:
@Test
public void t() {
Integer[] array= {0,1,2,3,4,5};//数值数组array
String[] brrby= {"a","b","c","d","e","f"};//字符串数组brrby
System.out.println("array原来内容:"+Arrays.toString(array));
System.out.println("brrby原来内容:"+Arrays.toString(brrby));
Generic.genericTurn(array, 2, 4);//将array里的第3个元素和第5个元素位置对调
Generic.genericTurn(brrby, 0, 5);//将array里的第1个元素和第6个元素位置对调
System.out.println("array对调后:"+Arrays.toString(array));
System.out.println("brrby对调后:"+Arrays.toString(brrby));
}
泛型上限
单个对象之间的继承我们都知道,但是集合之间有没有继承关系呢?
比如Number和Integer之间是父子关系,那么List< Number >和List< Integer >之间有继承关系吗?
@Test
public void t16() {
Integer integer=12;
Number number=integer;
System.out.println(number);
Integer[] integers= {1,2,3,4,5};
Number[] numbers=integers;
for(Number i:numbers) {
System.out.print(i+" ");
}
}
从上面的测试可以看出当两个类是继承关系时,这两个类的数组结构也是继承关系。接下来测试下两个有继承关系的类的集合是怎么样的:
所以要想两个集合之间有继承关系就需要用到泛型形参的上下限。
泛型的上限是<? extends XXX>的格式:表示这个类的最大类型是XXX,XXX下面的子类类型都能传入这个集合:
@Test
public void t16() {
List<Integer> iList=new ArrayList<>();
List<Double> dList=new ArrayList<>();
iList.add(1);
iList.add(2);
dList.add(2.3);
dList.add(3.4);
List<? extends Number> nList=new ArrayList<>();
nList=iList;
nList.forEach(System.out::println);
System.out.println("----------");
nList=dList;
nList.forEach(System.out::println);
}
这样nList的类型就是Number的任意一个子类了。
泛型下限
@Test
public void t16() {
List<Number> iList=new ArrayList<>();
List<Object> dList=new ArrayList<>();
iList.add(1);
iList.add(2);
dList.add(2.3);
dList.add(3.4);
List<? super Integer> nList=new ArrayList<>();
nList=iList;
nList.forEach(System.out::println);
System.out.println("----------");
nList=dList;
nList.forEach(System.out::println);
}
下限就是< ? super XXX>的格式,表示这个集合的类型是XXX的任意一个父类。