Java泛型:利用泛型动态确认方法返回值类型

本文介绍了如何在Java中利用泛型动态地返回对象和集合。内容涵盖泛型方法的基本概念,强调`public`与返回值之间的泛型声明,以及泛型的上界和下界限制。同时,文章提到了一些常见的泛型标识,如T、E、K、V和通配符`?`的用法。

根据泛型类型动态返回对象

public T unPackMessage(String interfaceCode, String respValue, Class clazz, String sysType) throws IOException {
log.info(">> unPackMessage start, interfaceCode is {}, respValue is {}", interfaceCode, respValue);
Map result = null;
// get pack_convert.prop file content
PackConvertMessage packConvertMessage = getPackConvertFileContent();
String func = packConvertMessage.getInterfaceMapping().get(interfaceCode);
if (StringUtils.isBlank(func)){
log.error("<< unPackMessage error, No response message with current interface configured");
return null;
}
String respSerialNumber = packConvertMessage.getRespFuncMapping().get(func);
String currPackType = PackConvertConstant.SystermType.CLIENT.equals(sysType) ? client_pack_type : pack_type;
switch (currPackType){
case PackConvertConstant.PackType.NON_FIXED_LENGTH:
result = unpackNoFixedMessage(respValue, connect_char, respSerialNumber, PACK_CONVERT_FILE_MAPPING_SEPARATOR, sysType);
break;
case PackConvertConstant.PackType.FIXED_LENGTH:
result = unpackFixedMessage(respValue, respSerialNumber, PACK_CONVERT_FILE_MAPPING_SEPARATOR);
break;
case PackConvertConstant.PackType.XML:
result = unpackXmlMessage(respValue, respSerialNumber, PACK_CONVERT_FILE_MAPPING_SEPARATOR);
break;
case PackConvertConstant.PackType.JSON:
result = unpackJsonMessage(respValue, respSerialNumber);
break;
}
log.info("<< unPackMessage success, return value is {}", JSON.toJSONString(result));
T t = JSON.toJavaObject(JSON.parseObject(JSON.toJSONString(result)), clazz);
return t;
}

根据泛型类型动态返回集合

public List convertFileToObj(String localFilePath, Class clazz, Class tclazz) throws IOException, NoSuchMethodException, IllegalAccessException, InstantiationException {
logger.info(">> convertFileToObj, localFilePath is {}, clazz is {}", localFilePath, clazz.getName());
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(localFilePath),"utf-8"));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null){
sb.append(line);
sb.append(System.getProperty("line.separator"));
}
List result = messageToObj(sb.toString(), clazz);
logger.info("<< convertFileToObj end");
return result;
}
public List convertFileToObj(String localFilePath, Class clazz) throws IOException, NoSuchMethodException, IllegalAccessException, InstantiationException {
logger.info(">> convertFileToObj, localFilePath is {}, clazz is {}", localFilePath, clazz.getName());
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(localFilePath),"utf-8"));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null){
sb.append(line);
sb.append(System.getProperty("line.separator"));
}
List result = messageToObj(sb.toString(), clazz);
logger.info("<< convertFileToObj end");
return result;
}

泛型方法基本介绍
public与返回值中间的非常重要,表示此方法声明为泛型方法
只有声明了的方法才是泛型方法,泛型类中使用了泛型的成员方法并不能算是泛型方法
表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T
与泛型类的定义一样,T可以随便写成任意标识,比如T、E、K、V、S等
泛型限制上下边界
泛型限制上边界:传入的类型只能是指定类的子类,比如Class
泛型限制下边界:传入的类型只能是指定类的父类,比如DiagnosticListener
另外附常用泛型标识说明
常见的一些泛型标识就是T(类型)、E(元素)、K(key)、V(value)、?(通配符,不确定的)这几个,其实填任何字母都行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值