Java生成类引用

9 java generics class

如果您有一个带签名的方法:

Class<? extends List<String>> getObjectType()
{
        return ?????;
}
Run Code Online (Sandbox Code Playgroud)

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

return List.class; //errors
return List<String>.class; //errors
return List.class<String>; //errors
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*her 10

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

return (Class<? extends List<String>>) List.class;
Run Code Online (Sandbox Code Playgroud)

是的它只是看起来不对劲.这只是Java的泛型系统乱七八糟的原因之一.


Aar*_*lla 5

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

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

@SuppressWarnings("unchecked")
Class<? extends List<String>> result = ....;
return result;
Run Code Online (Sandbox Code Playgroud)

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