2016-04-03 87 views
1

我有一个泛型方法,我怎么才能得到T类?如何在泛型方法中获得泛型类的类实例

class MyClass 
{ 
    static <T> void foo(T t) 
    { 
     // how to get T.class 
    } 
} 

t.getClass()得到最多的派生类,但T可能是一个超类,所以它在MyClass的情况下不起作用。 <Collection> foo(new ArrayList())。

+4

这是不可能的。阅读关于类型擦除。您可以做的最好的方法是添加另一个参数'Class clazz'。 –

+0

在这种情况下'T'是编译时的'Object',所以'Object.class'完成了这个任务。否则,'t.getClass()'怎么样?附:不要让任何人告诉你这与删除有关,它不会;你还没有为'T'定义任何界限。 –

+0

'''T'''是_weak_类型,但是'''getClass()''返回_strong_类型的类。看到[这个问题](http://stackoverflow.com/questions/106336/how-do-i-find-out-what-type-each-object-is-in-a-arraylistobject) –

回答

2

如果你想保留你的签名是不可能的。但是,有一种方法可以通过将类型作为单独的参数来解决此问题。

static <T> void foo(T t, Class<T> cls) { 
    // use cls 
} 

而不是调用

MyClass.<Collection> foo(new ArrayList()); 

然后调用

MyClass.foo(new ArrayList(), Collection.class); 
+0

我来自C++,我们使用泛型来推断类型。可悲的是,这在Java中是不可能的。 –