【问题标题】:Pass Class of a type parameter which may itself be parametrized in Java传递类型参数的类,它本身可以在 Java 中参数化
【发布时间】:2020-04-18 07:36:10
【问题描述】:

我有以下类,它在其构造函数中传递其类型的类:

class Foo<T>{
    Foo(Class<T> clazz){
        //do something
    }
}

我的问题是,如果我想让 T 成为泛型类型,我不能将它的类作为参数传递,除非我使用原始类型:

Foo<List> f = new Foo(List.class);

这可以编译,但是如何更改构造函数以实例化Foo&lt;List&lt;Integer&gt;&gt; 类型的对象?

Foo<List<Integer>> f1 = new Foo(List.class);

不起作用,因为 List != List&lt;Integer&gt; 而我不能做 List&lt;Integer&gt;.class 因为类型擦除。我现在正在做的是未经检查的演员阵容,但必须有更好的方法:

Foo&lt;List&lt;Integer&gt;&gt; f2 = (Foo&lt;List&lt;Integer&gt;&gt;)new Foo(List.class);

我想用它来方便地通过反射封装字段访问。这是我如何使用它的示例:

class StaticField<V> {
    private final Field field;
    StaticField(Class<?> declaringClass, String fieldName, Class<V> valueClass){
        //instantiate field and do some error handling including an
        //assertion whether field.getType() == valueClass
    }
    public V get(){...}
    public void set(V value){...}
}

【问题讨论】:

  • 在 Foo 中作为参数传递的类是什么?
  • 您正在寻找 Jackson TypeReference 或 Guava TypeToken
  • @JBNizet 我必须在我的项目(一个视频游戏模组)中使用大量反射,所以我创建了一个方便的类来封装对私有或最终字段的访问。类型 T 是引用字段的类型。该类用于在构造函数中检查字段的类型是否正确。我在帖子中添加了更详细的代码。

标签: java class generics types


【解决方案1】:

老实说,没有 true 方法可以做你想做的事,因为在运行时 VM 无法访问避免类型擦除所需的信息 - 这会阻止你类从获得信息返回对应的类,因此它最多只能返回您提供的相同类参数。

【讨论】:

    猜你喜欢
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多