如何将 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().