我见过类似的问题,但没有多大帮助。
例如,我有一个泛型类:
public class ContainerTest<T>
{
public void doSomething()
{
//I want here to determinate the Class of the type argument (In this case String)
}
}
和使用此容器类的另一个类
public class TestCase
{
private ContainerTest<String> containerTest;
public void someMethod()
{
containerTest.doSomething();
}
}
是否可以确定doSomething()方法中的类型参数的Class,而在ContainerTest类中没有显式类型变量/字段或任何构造函数?
更新:变更了ContainerTest类的格式
6条答案
按热度按时间des4xlb01#
唯一的方法是将类存储在示例变量中,并要求它作为构造函数的参数:
5w9g7ksd2#
如果你对反射方式感兴趣,我在这篇伟大的文章中找到了部分解决方案:http://www.artima.com/weblogs/viewpost.jsp?thread=208860
简而言之,您可以使用
java.lang.Class.getGenericSuperclass()
和java.lang.reflect.ParameterizedType.getActualTypeArguments()
方法,但是您必须子类化某个父超类。下面的代码段适用于一个直接扩展超类
AbstractUserType
的类。请参阅参考文章以获得更通用的解决方案。nimxete23#
没有"干净"的方法可以从类中获取泛型类型参数,相反,一种常见的模式是将泛型类型的Class传递给构造函数,并将其作为内部属性,就像在java.util.EnumMap实现中所做的那样。
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/EnumMap.htmlhttp://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/EnumMap.java
vd8tlhqk4#
不可能。因为type erasure(类型参数被编译为Object +类型转换),所以这是不可能的。如果你 * 真的 * 需要在运行时知道/强制执行类型,你可以存储一个对
Class
对象的引用。用途:
8i9zcol25#
有一种方法可以获取type参数的运行时类型,方法是使用Guava的
TypeToken
捕获它,这种解决方案的缺点是每次需要Container
示例时都必须创建一个匿名子类。这个解决方案的关键在上面代码中使用的
TypeToken
的构造函数的JavaDoc中描述:客户端创建一个空的匿名子类。这样做会将类型参数嵌入到匿名类的类型层次结构中,这样我们就可以在运行时重新构造它,尽管它被擦除了。
2guxujil6#
如果你能这样定义
那就有可能