如果你有签名的方法:
Class<? extends List<String>> getObjectType()
{
return ?????;
}
你如何返回列表类的适当的通用版本?
return List.class; //errors
return List<String>.class; //errors
return List.class<String>; //errors
什么是正确的语法来处理呢?
如果你有签名的方法:
Class<? extends List<String>> getObjectType()
{
return ?????;
}
你如何返回列表类的适当的通用版本?
return List.class; //errors
return List<String>.class; //errors
return List.class<String>; //errors
什么是正确的语法来处理呢?
你需要明确地将它转换为返回类型。 这工作:
return (Class<? extends List<String>>) List.class;
是的,它只是看起来是错误的。 这只是众多原因Java的泛型系统是一个烂摊子一个。
从书“有效的Java”(第二版,第137页):“不要使用通配符类型作为返回类型,而不是为你的用户提供额外的灵活性,这将迫使他们在客户端代码中使用通配符类型。”
这就是说,投,你必须首先创建一个临时变量:
@SuppressWarnings("unchecked")
Class<? extends List<String>> result = ....;
return result;
这工作,因为你可以在作业注释。 它不会对工作return
本身。 你也可以添加到方法,但会掩盖其他的问题。
你必须返回类的东西延伸List<String>
。 ArrayList<String>
是一个例子。 你可以试试:
ArrayList<String> myList = new ArrayList<String>();
...
return (Class<? extends List<String>>)myList.getClass();
List.class和List <String>的的.class - 在这一切的情况下,你需要铸造。 真的,你需要一个类型,有名单<String>的在运行时,somethig是这样的:
interface StringList extends List<String> {};
public Class<? extends List<String>> getObjectType() {
return StringList.class;
}