我有一个类型参数化方法,但我不能在类型参数化参数上调用getClass
,因为它可以是null
,所以我看到的唯一解决方案是从类型参数本身获得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
类对象)。
EDIT这不是上述问题的重复,因为我的类没有参数化,只有我的方法。
问题的核心是:是否有一种方法来获得代表我的方法的参数的参数化类型的
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)),您无法获得关于类型参数的此类信息。
解决方案是将方法重构为:
public <T> Class<T> myMethod(Class<T> theClass, T obj)
// other stuffs
return theClass;
}
但是调用者已经知道T是什么,所以真正的问题是,为什么需要它。
=> community wiki