2016-09-18 59 views
-2

我有一个类型的参数化方法,但我不能叫的类型参数化参数getClass因为它可以null,所以我看到的唯一的解决办法是从类型参数本身得到Class,不知何故:如何从方法的类型参数获取一个Class对象?

public <T> Class myMethod(T obj) 
{ 
    //can't do this: return obj.getClass() because null is permitted. 
} 

此方法只是说明问题。我的实际方法甚至不会返回参数的类,但以不同的方式使用它。问题的核心是这样的:有没有办法让Class对象代表我的方法参数的参数化类型,而不使用obj.getClass()(因为如果obj是null,我仍然需要知道方法的参数类型是什么调用,例如:<String>myMethod(null)必须返回java.lang.String类对象)。

编辑这不是上述问题的重复,因为我的类没有参数化,只有我的方法。

+1

你不能,期间。这是什么意图告诉你,'getClass()'不会? – chrylis

+0

@chrylis该方法是一个例子。我的实际方法不是那样的。我只是将问题简化为核心:我需要知道可能为null的对象的类。 – FinnTheHuman

+0

[如何获得泛型类型T的类实例]可能的副本(http://stackoverflow.com/questions/3437897/how-to-get-a-class-instance-of-generics-type-t) – fabian

回答

2

问题的核心是:有没有办法让Class对象,它表示参数化类型我的方法的参数[...]

Class号不包含任何有关类型参数值的信息。 Class只包含有关类的定义的数据,但不包含有关类型的用法的数据。事实上,由于类型擦除,您无法获得有关类型参数的这类信息(请参见https://docs.oracle.com/javase/tutorial/java/generics/genMethods.html(methods)和https://docs.oracle.com/javase/tutorial/java/generics/genTypes.html(types))。

+0

我现在看到。编译器根本没有保留任何信息。谢谢,这回答我的问题 – FinnTheHuman

0

的解决方案是重构方法:

public <T> Class<T> myMethod(Class<T> theClass, T obj) 
    // other stuffs 
    return theClass; 
} 

但主叫方已经知道T是,所以真正的问题是,你为什么需要这一点。

=>社区wiki

+0

这是我试图避免的方法。我将我的方法重构为'Class myMethod(Class cls,Object obj)' – FinnTheHuman

+0

参数'obj'在这里是没用的,因为它从来没有使用过。这个方法通常也很没用,因为它只是返回一个参数,所以为什么不直接使用传入的参数而不是调用方法呢? – newacct

+0

@newacct“其他东西” – 2016-09-21 05:33:22