Java的generized类参考(Java generized class reference)

2019-07-31 11:25发布

如果你有签名的方法:

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

你如何返回列表类的适当的通用版本?

return List.class; //errors
return List<String>.class; //errors
return List.class<String>; //errors

什么是正确的语法来处理呢?

Answer 1:

你需要明确地将它转换为返回类型。 这工作:

return (Class<? extends List<String>>) List.class;

是的,它只是看起来是错误的。 这只是众多原因Java的泛型系统是一个烂摊子一个。



Answer 2:

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

这就是说,投,你必须首先创建一个临时变量:

@SuppressWarnings("unchecked")
Class<? extends List<String>> result = ....;
return result;

这工作,因为你可以在作业注释。 它不会对工作return本身。 你也可以添加到方法,但会掩盖其他的问题。



Answer 3:

你必须返回类的东西延伸List<String>ArrayList<String>是一个例子。 你可以试试:

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


Answer 4:

List.class和List <String>的的.class - 在这一切的情况下,你需要铸造。 真的,你需要一个类型,有名单<String>的在运行时,somethig是这样的:

interface StringList extends List<String> {};

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


文章来源: Java generized class reference