【问题标题】:Cast generic type T into Class<T>将泛型类型 T 转换为 Class<T>
【发布时间】:2013-09-11 15:22:05
【问题描述】:

如何将泛型类型T 转换为Class&lt;T&gt; 的对象?

Class&lt;T&gt; T.classClass&lt;T&gt; T.getClass() 之类的东西不起作用,因为 T 不是变量。

函数应该如下所示:

public Class<T> getType() {
 return // Class of T
}

背景信息: 我有一些课程Class1&lt;T&gt;Class2&lt;T&gt;,......所有extend ParentClass&lt;T&gt;ParentClass 具有函数getType()。 我正在寻找一种更优雅的方式来获取类型,然后只需创建一个变量 Class&lt;?&gt; type 并以这种方式保存类型。

【问题讨论】:

  • 你能显示你的代码吗?你想在哪里这样做,为什么?
  • 欢迎来到可怕的类型擦除世界。这通常是不可能的。

标签: java class object types casting


【解决方案1】:

你在运行时不知道T(因为Type erasure)。

基本上,MyWonderfulClass&lt;String&gt; 将在运行时变为MyWonderfulClass&lt;Object&gt;,因此您没有任何机会检索它,除非您直接在构造函数或 setter 中给出类:

//class is a reserved keyword so I call it clazz instead.
public MyClass(Class<T> clazz) {
  this.clazz = clazz;
}

public Class<T> getType() {
  return this.clazz;
}

你也可以强制你的子类实现getType() : Class&lt;T&gt;

【讨论】:

  • 感谢您的解释!
【解决方案2】:

你可以这样做:

public class Parent<T> {
    private final Class<T> clazz;

    public Parent(Class<T> clazz) {
        this.clazz = clazz;
    }

    public Class<T> getType() {
        return clazz;
    }
}

public class Foo<T> extends Parent {

    public Foo(Class<T> clazz) {
        super(clazz);
    }
}

【讨论】:

  • 谢谢。我知道,只是对是否有更优雅的方法感兴趣(请参阅背景信息)。无论如何,谢谢。
猜你喜欢
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
相关资源
最近更新 更多