您可以检查运行时实际类型参数,但你只能通过从字段,方法,构造等反射API示例如下阅读:
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
public class TypesSample {
public List<String> sampleList;
public static void main(String[] args) throws Exception {
Field f = TypesSample.class.getField("sampleList");
ParameterizedType paramType = (ParameterizedType)f.getGenericType();
Type typeArgument = paramType.getActualTypeArguments()[0];
System.out.println(paramType.toString() + " with argument : " + typeArgument.toString());
}
}
它说:java.util.List<java.lang.String> with argument : class java.lang.String
你赢了由于类型擦除,不会从对象引用中获取实际的参数类型。
//编辑:
这是你能为你的情况做什么:
abstract class GenericDAO<T> {
public void add(Collection<T> many) {
Type typeArg = ((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
System.out.println("This is a DAO for " + typeArg);
}
}
// create DAOs that define what type parameter is
class IntegerDAO extends GenericDAO<Integer> {}
class StringDAO extends GenericDAO<String> {}
然后:
GenericDAO<Integer> integerDAO = new IntegerDAO();
integerDAO.add(Arrays.asList(1,2,3));
GenericDAO<String> stringDAO = new StringDAO();
stringDAO.add(Arrays.asList("A","B","C"));
说: 这是级Java一个DAO。 lang.Integer 这是一个java类的DAO。lang.String
但是您需要明确声明T
是通过扩展泛型类。
[类型擦除](http://docs.oracle.com/javase/tutorial/java/generics/erasure.html)将会很难。 – vcsjones 2012-08-07 14:10:41
为什么你需要知道类型? – 2012-08-07 14:14:37
@ Code-Guru:Hibernate通过类名向数据库添加元素 – Jaanus 2012-08-07 14:15:33