繁体   English   中英

Java生成类引用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM