如何创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();
我不知道这是否是可能的,因为任何类的文字将被编译为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]; }