Java生成类引用

时间:2009-08-05 18:03:08

标签: java generics class

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

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

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

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

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

4 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:5)

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

那就是说,要演员,你必须先创建一个临时变量:

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

List.class和List&lt; String&gt; .class - 在所有这些情况下你需要强制转换。真的需要一个类型,它有List&lt; String&gt;在运行时,像这样的东西:

interface StringList extends List<String> {};

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