获取课程<foo <t>&gt;在运行时给出泛型类型输入</foo <t>

时间:2014-09-23 17:17:47

标签: java generics

我知道有很多关于类似问题的问题,但我没有找到直接解决这个问题的问题。

以下是我试图实现的代码的框架:

class MyObj<T> {
    // Internals are unimportant ...
}

private <T> void foo(T arg) {
    Class<MyObj<T>> clazz = // What do I write here?

    // Here is one thing that works, but is quite ugly:
    @SuppressWarnings("unchecked")
    clazz = (Class<MyObj<T>>)(new MyObj<T>().getClass())

    // ...

    // Later, clazz is passed to a constructor of some other class
    OtherClass<MyObj<T>> foo = new OtherClass<>(clazz);
}

问题1:有没有人有更好的建议如何填充clazz?理想情况下,它会避免调用new

问题2:鉴于上面的丑陋(但工作)代码,是否有任何可能会破坏的情况?我不喜欢@SuppressWarnings,并担心我可能隐藏的问题。

1 个答案:

答案 0 :(得分:3)

为避免实例化,您可以写:

Class<MyObj<T>> clazz = (Class) MyObj.class;

由于擦除,Class存在一个MyObj实例,无论它可能具有什么类型参数,因此虽然这很难看,但它是安全的。