Java运行时泛类类型强制转换

举个例子,你有一个Object类型的List,List<Object> list = new ArrayList<>();

用Object类是为了能够让它能放各种类型的数据,而运行时你才知道数据是什么类型,假设是String类型的,又假设之前你有向其中添加一些数据

list.add("test");
list.add("abc");

这个时候你想把这个List转换为String类型的List,以方便后面的操作

于是天真的写了这种代码List<String> newList = (List<String>)list;

然后发现这种转换编译器是不允许的。


当然非要这么转换也不是不行,很自然的方法就是新创建一个String类型的List,然后遍历原来的List,把元素一个一个转为String类型然后存入新的List中。

这种方法在List元素很少的情况的还是可行的,但是如果元素很多,这种方法既浪费时间,又要白白创建一个新List浪费空间。


如果你对List每一个元素的类型很有自信,那么就可以适当“欺骗”一下Java让它不要多管闲事,我就爱转你管我。

@SuppressWarnings("unchecked")
public static <T> List<T> convert(List<?> list, Class<T> c) {
	return (List<T>)list;
}
给一个例子

public static void main(String[] args) {
	List<Object> list = new ArrayList<>();
	list.add("test");
	list.add("abc");
	
	List<String> strs = convert(list, String.class);
	for (String str : strs) {
		System.out.println(str);
	}
}

----------------------------------------更新----------------------------------------

其实那个convert方法可以更简单,Class<T>这个参数是多余的,使用泛型T并不需要一个带泛型的参数。


下面的例子同样实现了我们需要的功能。

public static void main(String[] args) {
	List<Object> list = new ArrayList<>();
	list.add("hahaha");
	list.add("123");
	
	List<String> newList = convert(list);
	
	for (String str : newList) {
		System.out.println(str);
	}
}

@SuppressWarnings("unchecked")
public static <T> List<T> convert(List<?> list) {
	return (List<T>)list;
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值