关于泛型

自定义泛型方法

规则:
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的任意一个父类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Brrby

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值