从TypeReference转换<;E>;上课<;E>;无强制转换(Java)
我想在Java中从从TypeReference转换<;E>;上课<;E>;无强制转换(Java),java,generics,casting,jackson,Java,Generics,Casting,Jackson,我想在Java中从TypeReference对象转到Class对象,而不使用强制转换。我需要使用TypeReference,因为我的代码使用Jackson的方式;我需要Class对象,因为我想用它来推断我的应用程序中的其他泛型类的类型 我知道TypeReference.getType()将返回一个对象。基本上,如果我能找到一种不用强制转换就能从类型到类使用代码的方法,那么我已经解决了我的问题 Javadoc参考文献: 我看不到任何不浇铸的解决方案。然而,这里有一种通用铸造的解决方案。也许这
TypeReference
对象转到Class
对象,而不使用强制转换。我需要使用TypeReference
,因为我的代码使用Jackson的方式;我需要Class
对象,因为我想用它来推断我的应用程序中的其他泛型类的类型
我知道TypeReference.getType()
将返回一个对象。基本上,如果我能找到一种不用强制转换就能从类型
到类
使用代码的方法,那么我已经解决了我的问题
Javadoc参考文献:
- 我看不到任何不浇铸的解决方案。然而,这里有一种通用铸造的解决方案。也许这也有帮助:
public class Converter {
public static <T> Class<T> convert(TypeReference<T> ref) {
return (Class<T>)((ParameterizedType) ref.getType()).getRawType();
}
}
您不能强制转换它:这是一个非常基本的Java问题——类型引用和类不是从同一个基类派生的,所以它违背了语言定义 但如果我猜对了您想要实现的目标,您可以使用
JavaType
转换原始(类型擦除)类:
JavaType type = mapper.getTypeFactory().constructType(ref);
Class<?> cls = type.getRawClass();
JavaType type=mapper.getTypeFactory().constructType(ref);
类cls=type.getRawClass();
你可以用
TypeReference
,Class
,甚至仅仅是基本的JDKType
,Type
是一个接口,而不是对象,而Class
是object
的子类。我知道这一点。但我的问题是如何从TypeReference
转到Class
。在中只提到了Type
接口,以防它帮助某人解决问题。Type
不是表示没有任何类加载器信息的类型吗?因此,如果它指向classFoo
,它可能意味着由不同的类加载器加载的任何实际的Foo
类?但从技术上讲,class
实现了Type
接口,因此简单的cast应该可以完成这项工作。这可能很有用:哪个包/jar是来自JavaType
的?不管怎样……它来自Jackson。但是,我不确定您的mapper
对象是什么类类型。它不是ObjectMapper
;我找不到ObjectMaper.getTypeFactory()
方法。取而代之的是,我从您的应用程序派生的解决方案是TypeFactory.defaultInstance().constructType(typeReference.getRawClass()
。谢谢。ObjectMapper
有getTypeFactory()
(请参阅),但可能旧版本没有公开它。如果是的话,您可以使用defaultInstance。请稍等……这是FasterXML的Jackson,而不是Codehaus。Jackson的哪个版本是官方版本?Jackson从Codehaus存储库迁移到GitHub,用于2.x。所以Codehaus有旧的(1.9),github有新的。新的Java包位于com.fasterxml
下。两者都是官方的,只是不同的Java包。
interface java.util.List
JavaType type = mapper.getTypeFactory().constructType(ref);
Class<?> cls = type.getRawClass();