【问题标题】:how to get a class reference to parameterized type如何获取对参数化类型的类引用
【发布时间】:2015-02-24 11:56:09
【问题描述】:

是否有机会将参数化类型分配给类引用。

    Class<Set>  c1= Set.class;   //OK
    Class<Set<Integer>> c2 = Set<Integer>.class; //Makes error

【问题讨论】:

    标签: java generics reflection


    【解决方案1】:

    .class 文字与类名一起使用,或在对象上调用getClass() 方法会返回Class 实例,并且对于任何类,都只有一个Class 实例与之关联。

    对于泛型类型也是如此。一个类List&lt;T&gt; 只有一个类实例,即List.class。不同的类型参数不会有不同的类类型。这类似于C++ 如何实现泛型,其中每个泛型类型实例化都有一个单独的Class 实例。所以在Java中,你不能做Set&lt;Integer&gt;.class。 Java 不允许这样做,因为它没有意义,并且可能对Class 实例的数量给出错误的意图。

    但是,如果你想要一个Class&lt;Set&lt;Integer&gt;&gt;,你可以通过一些类型转换来实现(这将是安全的),如下所示:

    Class<Set<Integer>> clazz = (Class<Set<Integer>>)(Class<?>) Set.class;
    

    这将完全正常。

    【讨论】:

    • 非常感谢。我了解“类型擦除”和反射,但我不知道如何摆脱烦人的类型安全警告(例如,当动态调用的方法返回参数化类型时)。现在我知道了:-)
    【解决方案2】:

    你不能这样做,因为类型参数信息在运行时消失了,然后 .class 语句实际上被评估了。

    你只能这样做:

    Set<Integer> someSet = ..
    Class<?> c2 = someSet.class;
    

    【讨论】:

      【解决方案3】:
      new ParameterizedTypeReference<List<ClassName>>() {} Should work.
      

      下面给出交换方法Rest Template类交换函数的例子

      功能要求

      public <T> ResponseEntity<T> exchange(URI url, HttpMethod method, @Nullable HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseType) throws RestClientException 
      

      实施

      restTemplate.exchange(new URI("Http://{host}:{port}/{url}"), HttpMethod.POST, customObject, new ParameterizedTypeReference<List<ResponseClassName>>() {});
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-21
        相关资源
        最近更新 更多