[英]Java generized class reference
如果您有一个带签名的方法:
Class<? extends List<String>> getObjectType()
{
return ?????;
}
如何返回List类的正确通用版本?
return List.class; //errors
return List<String>.class; //errors
return List.class<String>; //errors
处理这个问题的正确语法是什么?
您需要将其显式转换为返回类型。 这有效:
return (Class<? extends List<String>>) List.class;
是的它只是看起来不对劲。 这只是Java的泛型系统乱七八糟的原因之一。
从“Effective 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 - 在所有这些情况下你需要强制转换。 真的你需要一个在运行时具有List <String>的类型,像这样的somethig:
interface StringList extends List<String> {};
public Class<? extends List<String>> getObjectType() {
return StringList.class;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.