【问题标题】:Class object of generic class (java)泛型类的类对象(java)
【发布时间】:2010-11-07 22:25:31
【问题描述】:

在 java 中有没有办法获得类似 Class<List<Object>> 的实例?

【问题讨论】:

    标签: java generics


    【解决方案1】:

    您可以使用以下方法获取 List 类型的类对象:

    Class.forName("java.util.List")
    

    List.class
    

    但是因为 java 泛型是使用erasures 实现的,所以你不能为每个特定的类获取一个专门的对象。

    【讨论】:

      【解决方案2】:
      List.class
      

      特定类型的泛型在编译时被“擦除”。

      【讨论】:

        【解决方案3】:

        由于类型擦除,在 Class 级别,所有 List 接口都是相同的。它们仅在编译时不同。因此,您可以将Class<List> 作为一种类型,其中List.class 属于该类型,但您无法获得更具体的信息,因为它们不是单独的类,只是类型声明被编译器擦除为显式强制转换.

        【讨论】:

          【解决方案4】:

          如其他答案中所述,Class 表示已擦除类型。要表示ArrayList<Object> 之类的东西,您需要一个Type。一个简单的方法是:

          new ArrayList<Object>() {}.getClass().getGenericSuperclass()
          

          1.5 中引入的泛型类型 API 相对容易找到。

          【讨论】:

          • 奇怪...不创建对象就无法做到这一点?
          • 不仅创建一个新对象,一个新类(在本例中为匿名内部类)。但是那个例子应该是新的 ArrayList,不是吗?制作匿名列表需要您实现所有方法。
          • 一晒:嗯,是的。它是 getGenericSuperclass 而不是 getGenericSupertype。然后是实现多个接口的问题。
          • Jason S:谁在乎?没有新的也有办法做到这一点,但你为代码使用了大量的内存。
          • 但你还是要在这里进行未经检查的转换
          【解决方案5】:

          怎么样

          (Class<List<Object>>)(Class<?>)List.class
          

          【讨论】:

          • 我喜欢这个主意。它会导致未经检查的强制转换警告,但我猜它很容易被忽略。感谢分享!
          • 这太棒了。正是我今天解决一个困难的泛型问题所需要的。
          • 真的需要(Class&lt;?&gt;) 吗?在我的测试中,(Class&lt;List&lt;Object&gt;&gt;)List.class 似乎就足够了。
          • @alarive: List.class 的类型为 Class&lt;List&gt;。我上次检查时从Class&lt;List&gt;Class&lt;List&lt;Object&gt;&gt; 的转换是非法的(因为没有任何类型可能是两者的子类型)
          • @MonkeySupersonic:如果你得到“列表类型不是通用的”,那么你有错误的“列表”类型(可能是类java.awt.List 而不是接口java.util.List)。检查您的导入。
          【解决方案6】:
          public final class ClassUtil {
              @SuppressWarnings("unchecked")
              public static <T> Class<T> castClass(Class<?> aClass) {
                  return (Class<T>)aClass;
              }
          }
          

          现在你打电话:

          Class<List<Object>> clazz = ClassUtil.<List<Object>>castClass(List.class);
          

          【讨论】:

          • 不错的主意。这与(Class&lt;List&lt;Object&gt;&gt;)(Class&lt;?&gt;)List.class 基本相同,但如果您需要多个类对象,则在 ClassUtil 中只有一个未经检查的强制转换。
          • 我喜欢它,因为你不创建新对象。凉爽的。谢谢。
          • 为了提供某种类型安全性,您可以要求参数为 T.supersuperpublic static &lt;T&gt; Class&lt;T&gt; castClass(Class&lt;? super T&gt; aClass)
          【解决方案7】:

          你可以使用杰克逊的ObjectMapper

          ObjectMapper objectMapper = new ObjectMapper();
          CollectionType listType = objectMapper.getTypeFactory().constructCollectionType(List.class, ElementClass.class)
          

          没有未经检查的警告,没有空的 List 实例。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-26
            • 1970-01-01
            • 2012-01-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多