Java生成类引用
如果您有签名的方法:
Class<? extends List> getObjectType() { return ?????; }
如何返回List类的正确通用版本?
return List.class; //errors return List.class; //errors return List.class; //errors
处理这个问题的正确语法是什么?
您需要将其显式转换为返回类型。 这有效:
return (Class extends List>) List.class;
是的,它只是看起来不对 这只是Java的generics系统混乱的众多原因之一。
从“Effective Java”一书(第二版,第137页):“不要使用通配符类型作为返回类型。它不会为用户提供额外的灵活性,而是迫使他们在客户端代码中使用通配符类型。”
也就是说,要进行强制转换,首先必须创建一个临时变量:
@SuppressWarnings("unchecked") Class extends List> result = ....; return result;
这是有效的,因为您可以在作业上进行注释。 它不适用于return
本身。 您也可以将其添加到方法中,但这也会隐藏其他问题。
您必须返回扩展List
的类的类。 ArrayList
就是一个例子。 你可以试试:
ArrayList myList = new ArrayList (); ... return (Class extends List >)myList.getClass();
List.class和List
interface StringList extends List {}; public Class extends List > getObjectType() { return StringList.class; }