如果你有一个带签名的方法:
Class<? extends List<String>> getObjectType()
{
return ?????;
}
如何返回List类的正确通用版本?
return List.class; //errors
return List<String>.class; //errors
return List.class<String>; //errors
处理此问题的正确语法是什么?
答案 0 :(得分:10)
您需要将其显式转换为返回类型。这有效:
return (Class<? extends List<String>>) List.class;
是的,它只是看起来不对劲。这只是Java的泛型系统乱七八糟的原因之一。
答案 1 :(得分:5)
从“Effective Java”一书(第二版,第137页):“不要使用通配符类型作为返回类型。它不会为用户提供额外的灵活性,而是强制它们在客户端代码中使用通配符类型。 “
那就是说,要演员,你必须先创建一个临时变量:
@SuppressWarnings("unchecked")
Class<? extends List<String>> result = ....;
return result;
这是有效的,因为您可以在作业上注释。它不适用于return
本身。您也可以将其添加到方法中,但这也会隐藏其他问题。
答案 2 :(得分:2)
你必须返回扩展List<String>
的东西的类。 ArrayList<String>
就是一个例子。你可以尝试:
ArrayList<String> myList = new ArrayList<String>();
...
return (Class<? extends List<String>>)myList.getClass();
答案 3 :(得分:0)
List.class和List&lt; String&gt; .class - 在所有这些情况下你需要强制转换。真的需要一个类型,它有List&lt; String&gt;在运行时,像这样的东西:
interface StringList extends List<String> {};
public Class<? extends List<String>> getObjectType() {
return StringList.class;
}