当前位置: 首页 > 面试题库 >

通用通配符类型不应在返回参数中使用

马冯浩
2023-03-14
问题内容

是否可以在方法的返回参数中使用通用通配符类型,这是否可行?

换句话说,确实可以像下面这样声明一个接口:

interface Foo<T> {
  Collection<? extends T> next();
}

另外,可以说通用通配符类型仅在方法的 参数声明 时才有意义吗?


问题答案:

使用通配符类型(例如在方法正式参数中)的主要好处是为用户提供了灵活性,使其可以传递任何类型的CollectionList或任何实现Collection的东西(假设collection声明为Collection<?>)。您通常会发现自己在形式参数中使用通配符类型。

但理想情况下,应避免将它们用作方法的返回类型。因此,您将强制该方法的用户在调用方使用通配符类型,即使他们不想这样做也是如此。通过使用通配符类型,您是在说,嘿!此方法可以返回的任何类型Collection,因此,您的工作就是做这件事。你不应该那样做。最好使用有界类型参数。使用有界类型参数时,将根据您传递的类型或方法调用的目标类型来推断类型。

这是来自 有效Java项目28 的引用

不要将通配符类型用作返回类型。 与其给用户提供更多的灵活性,不如说是迫使他们在客户端代码中使用通配符类型。
正确使用的通配符类型对于类的用户几乎是不可见的。它们使方法接受应接受的参数,并拒绝应拒绝的参数。
如果类的用户必须考虑通配符类型,则类的API可能存在问题。



 类似资料:
  • 此外,是否可以说泛型通配符类型仅在方法的参数声明中才有意义?

  • 所以我看了官方的java教程,https://docs.oracle.com/javase/tutorial/java/generics/index.html,也搜索了stackoverflow,结果发现使用

  • 问题内容: 我在很多地方都读过,包括在方法返回类型中使用有界通配符是一个坏主意。但是,我在课堂上找不到避免这种情况的方法。我想念什么吗? 情况看起来像这样: 总而言之,这是一个我希望能够 使用 任何与英语有所不同的出版物的类。该类需要允许从外部访问发布,但理想情况下,的调用者不希望将结果用作有界通配符。他们会很高兴的。 有办法解决吗? 问题答案: 有界通配符具有传染性,这就是您链接到的页面似乎在哀

  • 问题内容: 我试图理解Java泛型,它们似乎很难理解。例如,这很好… …就是这个… … 还有这个 … …但是不能编译: 有人可以用简单的语言解释发生了什么吗? 问题答案: 对于泛型类型,主要要了解的是它们不是协变的。 因此,尽管您可以这样做: 以下内容将无法编译: 这是为了避免您绕过通用类型的情况: 因此,一一讲解您的示例 1个 您的通用方法采用a ,而您采用;(基本上是)。可以分配给类型,并且编

  • 问题内容: 使用Type通配符的Update()也存在该问题,但是我发现DocumentExists()的作用相同,因此在此将问题简化如下: 这有效… 但这失败了 如果我完全省略Type,它也会失败。有人知道如何进行这项工作吗?(即使不管文档的类型如何都可以,对我而言还是可以的。) 问题答案: 据我所知,不可能在类型名称中指定通配符,但是您可以做一些技巧。 您可以在索引中查询具有特定ID的文档,并

  • 问题内容: Java通常可以基于参数(甚至与返回类型(例如,与C#相反))来推断泛型。 恰当的例子:我有一个通用类,它只存储一对值,并且可以按以下方式使用: 该方法如下所示: 非常好。但是,这不再适用于以下需要通配符的用例: (请注意显式强制转换以进行正确的类型。) 代码失败,并显示以下错误(由Eclipse提供): 类型不匹配:无法从转换为 但是,显式调用构造函数仍然可以按预期工作: 有人可以解