Java生成类引用

如果您有签名的方法:

Class<? extends List> getObjectType() { return ?????; } 

如何返回List类的正确通用版本?

 return List.class; //errors return List.class; //errors return List.class; //errors 

处理这个问题的正确语法是什么?

您需要将其显式转换为返回类型。 这有效:

 return (Class>) List.class; 

是的,它只是看起来不对 这只是Java的generics系统混乱的众多原因之一。

从“Effective Java”一书(第二版,第137页):“不要使用通配符类型作为返回类型。它不会为用户提供额外的灵活性,而是迫使他们在客户端代码中使用通配符类型。”

也就是说,要进行强制转换,首先必须创建一个临时变量:

 @SuppressWarnings("unchecked") Class> result = ....; return result; 

这是有效的,因为您可以在作业上进行注释。 它不适用于return本身。 您也可以将其添加到方法中,但这也会隐藏其他问题。

您必须返回扩展List的类的类。 ArrayList就是一个例子。 你可以试试:

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

List.class和List .class – 在所有这些情况下你需要强制转换。 真的,你需要一个在运行时具有List 的类型,像这样的somethig:

 interface StringList extends List {}; public Class> getObjectType() { return StringList.class; }