如何创build一个已知types的类文字:Class <List <String >>

采取以下措施:

public Class<List<String>> getObjectType() { // what can I return here? } 

什么类字面expression式可以从这个方法返回,这将满足generics和编译? List.class不会编译, List.<String>class也不会。

如果你想知道“为什么”,我正在写一个Spring的FactoryBean<List<String>> ,它需要我实现Class<List<String>> getObjectType() 。 但是,这不是一个spring的问题。

编辑:我的哀号已经被SpringSource的权力所听到,所以Spring 3.0.1将getObjectType()的返回types更改为Class<?> ,这很好地避免了这个问题。

你总是可以投射到你所需要的东西上,像这样

 return (Class<List<String>>) new ArrayList<String>().getClass(); 

要么

 return (Class<List<String>>) Collections.<String>emptyList().getClass(); 

但我认为这不是你所追求的。 那么它的工作,有一个警告,但它不完全是“美丽的”。

我刚刚find了这个

为什么没有通配符参数化types的类文字?

由于通配符参数化types没有确切的运行时types表示。

所以铸造可能是唯一的出路。

你不应该使用构造Class<List<String>> 。 这是无意义的,应该在Java中产生一个警告(但是不)。 类实例总是表示原始types,所以你可以有Class<List> ; 而已。 如果你想要表示一个像List<String>泛化types,你需要一个像Guice使用的“超级types令牌”:

http://google-guice.googlecode.com/git/javadoc/com/google/inject/TypeLiteral.html

Class<List<String>>存在本质上是危险的。 这是为什么:

 // This statement generates a warning - for a reason... Class<List<String>> unsafeListClass = (Class<List<String>>) (Class<?>) List.class; List<Integer> integerList = new ArrayList<Integer>(); // Ok integerList.add(42); // Ok System.out.println(unsafeListClass.isInstance(integerList)); // Prints "true". List<String> stringList = unsafeListClass.cast(integerList); // Succeeds, with no warning! stringList.add("Hello, World!"); // Also succeeds with no warning for (int x: integerList) { // Compiles without warning, but throws ClassCastException at runtime System.out.println(100-x); } 

你可以像这样实现这个方法:

 public Class<List<String>> getObjectType() { return (Class<List<String>>) ((Class)List.class); } 

在springframework.org上find这个链接给出一些见解。

例如

 List<String> myList = new ArrayList<String>(); return (Class<List<String>>)myList.getClass(); 

查看关于SUN论坛的讨论:

http://forums.sun.com/thread.jspa?threadID=5253007

以及引用的博客文章,通过使用“超types令牌”来描述工作:

http://gafter.blogspot.com/2006/12/super-type-tokens.html

我不知道这是否是可能的,因为任何类的文字将被编译为Class.forName(...) ,因为这发生在运行时没有通用的信息。

我不确定,但我问的下列问题可能与您有关…

Javagenericstypes参数和对这些types的操作

那这个呢:

 public class TestMain { public static void main(String[] args) throws Exception { Type type = TestMain.class.getMethod("dummy").getGenericReturnType(); System.out.println("type = " + type); } public List<Integer> dummy() {return null;} } 

这打印:

 type = java.util.List<java.lang.Integer> 

以下方法是有问题的:

 > public Class<List<String>> getModelType() { > return (Class<List<String>>) new ArrayList<String>().getClass(); > } 

例如,如果你想testing一个对象说的types

 org.eclipse.emf.common.util.BasicEList<String> 

是types的

 List<String> 

基于上述getModelType()方法的结果,例如:

 BasicEList<String> fromObject = ...; if (getModelType().isAssignableFrom(fromObject.getClass())) { transferFromModelToUi(getModelType().cast(fromObject)); } 

它会导致错误,而它应该是真实的,因为两个对象都实现接口List(因为getModelType()返回一个Listtypes的Class对象而不是ArrayList)。

这里有一个方法适用于我(有点麻烦,但导致在上面的例子中正确的结果,可以被移动到一个静态的初始化):

 public Class<List<String>> getModelType() { Class<?> arrayListClass = new ArrayList<String>().getClass(); Class<?>[] interfaces = arrayListClass.getInterfaces(); int index = 0; for (int i = 0; i < interfaces.length; i++) { if (interfaces[i].equals(List.class)) { index = i; break; } } return (Class<List<String>>) interfaces[index]; }