我有一个具有以下签名的方法:
// Converts a json string to a list of objects
// Assumption: json is an array, and all items in the list are of the same type
public <T> List<T> getListFromJson( String json, Class<T> itemType, List<T> defValue ) {
final ArrayList<T> list = new ArrayList<T>();
for( JsonElement e : parser.parse(json).getAsJsonArray())
list.add( (T) (
Number.class.isAssignableFrom(itemType) ? e.getAsNumber() :
Boolean.class.isAssignableFrom(itemType) ? e.getAsBoolean() :
Character.class.isAssignableFrom(itemType) ? e.getAsCharacter() :
String.class.isAssignableFrom(itemType) ? e.getAsString() :
JsonElement.class.isAssignableFrom(itemType) ? e :
null
)
);
return list;
}
它读取 json 字符串并将其转换为适当类型的对象的列表,例如。整数、字符串等
有没有一种可靠的方法来删除Class<T>
通过从方法中推断出参数List<T>
范围?例如。有没有办法可以将方法签名更改为以下内容而不丢失功能?
public <T> List<T> getListFromJson( String json, List<T> defValue ) {
...
}
看起来解决方案需要对 ParameterizedType 进行一些奇特的操作。我查看了以下内容,但要么我错误地使用了这些方法,要么它们没有达到我的预期:
- getTypeArguments() 来自http://www.artima.com/weblogs/viewpost.jsp?thread=208860
- 从 getActualTypeArguments()https://code.google.com/p/aphillips/source/browse/commons-lang/trunk/src/main/java/com/qrmedia/commons/lang/ClassUtils.java
Due to 类型擦除,你绝对不能“推断”什么T
是——它在运行时甚至不存在。最接近的是检查中的值defValue
(如果它有值)并获取那里元素的类。
Class<?> tType = defValue.get(0).getClass();
if (Boolean.class.isAssignableFrom(tType)) { //...
Edit
关于您使用反射的想法getTypeArguments()
等。这些仅提供数据declared类型,从不actual类型。例如,如果你有一个句柄Method
对象并被调用getTypeParameters()
,你只会得到一个包含代表类型对象的数组T
--不是实际的类型T
表示在某个特定的运行时调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)