Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从TypeReference转换<;E>;上课<;E>;无强制转换(Java)_Java_Generics_Casting_Jackson - Fatal编程技术网

从TypeReference转换<;E>;上课<;E>;无强制转换(Java)

从TypeReference转换<;E>;上课<;E>;无强制转换(Java),java,generics,casting,jackson,Java,Generics,Casting,Jackson,我想在Java中从TypeReference对象转到Class对象,而不使用强制转换。我需要使用TypeReference,因为我的代码使用Jackson的方式;我需要Class对象,因为我想用它来推断我的应用程序中的其他泛型类的类型 我知道TypeReference.getType()将返回一个对象。基本上,如果我能找到一种不用强制转换就能从类型到类使用代码的方法,那么我已经解决了我的问题 Javadoc参考文献: 我看不到任何不浇铸的解决方案。然而,这里有一种通用铸造的解决方案。也许这

我想在Java中从
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
      ,甚至仅仅是基本的JDK
      Type
      Type
      是一个接口,而不是对象,而
      Class
      object
      的子类。我知道这一点。但我的问题是如何从
      TypeReference
      转到
      Class
      。在中只提到了
      Type
      接口,以防它帮助某人解决问题。
      Type
      不是表示没有任何类加载器信息的类型吗?因此,如果它指向class
      Foo
      ,它可能意味着由不同的类加载器加载的任何实际的
      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();