如何将 Class<?> 转换为 Class<T>?
How to cast Class<?> to Class<T>?
我有 class 和 Class<?>
字段。我有一个方法,必须在 Jackson 的帮助下将字符串转换为对象。
private Class<?> myType = ...;
private String jsonRepresentationOfObject = ....;
ObjectMapper mapper = new ObjectMapper();
public <T> T get() {
return mapper.readValue(jsonRepresentationOfObject, myType);
}
是否有可能将 myType
转换为 T
?或者这是不可能的,因为类型擦除?
如果您完全确定 readValue
的结果是 T
类型,您可以这样做:
public <T> T get() {
return (T)mapper.readValue(jsonRepresentationOfObject, myType);
}
尽管如此,您将不得不 @SuppressWarnings
进行未经检查的转换。
在其他语言中(例如可以与 Java 互操作的 Kotlin),您可以使用 reified generics
但由于类型擦除,它不存在于 Java 中。
如果 readValue
的结果 不是 T
那么你会得到 ClassCastException
所以明智地使用它。
这是不可能的,感谢类型擦除。这就是为什么 Java 中的某些库函数让您传入一个 class 的实例,该实例除了执行 .getClass()
外不用于任何其他用途。我现在实际上正在编写非常相似的代码,我最终在 (T returnType)
的 class 上签名(相当于),然后在 readValue
调用中,我传入 returnType.getClass()
.
我有 class 和 Class<?>
字段。我有一个方法,必须在 Jackson 的帮助下将字符串转换为对象。
private Class<?> myType = ...;
private String jsonRepresentationOfObject = ....;
ObjectMapper mapper = new ObjectMapper();
public <T> T get() {
return mapper.readValue(jsonRepresentationOfObject, myType);
}
是否有可能将 myType
转换为 T
?或者这是不可能的,因为类型擦除?
如果您完全确定 readValue
的结果是 T
类型,您可以这样做:
public <T> T get() {
return (T)mapper.readValue(jsonRepresentationOfObject, myType);
}
尽管如此,您将不得不 @SuppressWarnings
进行未经检查的转换。
在其他语言中(例如可以与 Java 互操作的 Kotlin),您可以使用 reified generics
但由于类型擦除,它不存在于 Java 中。
如果 readValue
的结果 不是 T
那么你会得到 ClassCastException
所以明智地使用它。
这是不可能的,感谢类型擦除。这就是为什么 Java 中的某些库函数让您传入一个 class 的实例,该实例除了执行 .getClass()
外不用于任何其他用途。我现在实际上正在编写非常相似的代码,我最终在 (T returnType)
的 class 上签名(相当于),然后在 readValue
调用中,我传入 returnType.getClass()
.