【问题标题】:Java Generics: Type Extension In Method Declaration ParametersJava 泛型:方法声明参数中的类型扩展
【发布时间】:2014-02-27 20:25:32
【问题描述】:

我正在学习 Java 泛型。我的理解是泛型按类型参数化集合。在 Oracle 教程中有如下评论:

在通用代码中,问号 (?),称为通配符, 表示未知类型。

在下一页有以下在参数中使用上限通配符的方法声明示例:

public void process(List<? extends Foo> list)

鉴于此,我想知道为什么这个方法声明是非法的:

public void process(List<E extends Number> list)

虽然这个是合法的:

public <E extends Number> void process(List<E> list)

【问题讨论】:

    标签: java generics wildcard


    【解决方案1】:

    在指定方法参数类型时,您使用的是泛型类型,因此必须预先定义它。在此语句中,您使用没有定义的 E

    public void process(List<E extends Number> list) { /* ... */ }
    

    但是,在第二个中,它是在方法返回类型(void)之前定义的:

    public <E extends Number> void process(List<E> list) { /* ... */ }
    

    【讨论】:

    • 我认为这实际上是对问题的重述。那么,为什么在没有“预先定义”的情况下允许使用通配符参数?既然允许,为什么对“T”有这样的限制?
    • 但是通配符是在JVM中定义的。这是一种特殊情况,内置于语言中。另一方面,T 是你想出的东西,所以在使用它之前你必须告诉 Java T 是什么。它可以是简单的 或更受限制的 ,但必须在使用前定义。
    • 非常感谢,凤凰。我正在考虑“T”和“?”就像泛型中的标记一样。通配符上的谷歌搜索主要是关于泛型的帖子,这些帖子肯定了这一概念。刚才我在 Google 上搜索了“java 通配符 -generics”并找到了 java.lang.reflect 接口 WildcardType。文档说:“WildcardType 表示通配符类型表达式,例如 ?、? extends Number 或 ? super Integer。”这对我来说不是很清楚。是 ”?”某种实现此接口的内置对象?我的 Java 功夫很生锈。 :-)
    【解决方案2】:

    没有比“因为这就是语言的设计方式”更好的答案了。但一种思考方式是,类型参数被视为方法的另一个参数列表:它们必须同时出现在一个(有序)列表中。

    您可以通过显式传递类型参数来调用泛型方法:例如,foo.&lt;Integer, String&gt;process(list)。这意味着类型参数必须有一个明确的顺序,就像普通的值参数一样。

    【讨论】:

      【解决方案3】:

      要完成@phoenix 的回答,此语句中的问题

      public void process(List<E extends Number> list) { /* ... */ }
      

      是你的泛型类型 E 的声明是在错误的地方。正确的位置是在返回类型之前:

      public <E extends Number> void process(List<E> list) { /* ... */ }
      

      但是,定义泛型类型的另一个可能位置是类声明本身:

      class MyClass<E extends Number> {
      
          public void process(List<E> list) { /* ... */ }
      
      }
      

      【讨论】:

        【解决方案4】:

        大约两者都是相同的,但我只使用第一个。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-24
          • 1970-01-01
          • 2017-06-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多