【问题标题】:'U extends Something' VS just 'Something' in Bounded Type Parameters'U extends Something' VS just 'Something' in Bounded Type Parameters
【发布时间】:2015-05-13 01:59:50
【问题描述】:

假设我在泛型方法中有一个有界类型参数(Java™ 教程中的一个示例,http://docs.oracle.com/javase/tutorial/java/generics/bounded.html):

public static <U extends Number> void inspect(U u) {
}

然后,我可以使用任何 Number 子类型参数调用:

inspect(1);
inspect(1.0);
inspect(1.0f);

但是,这与使用带有 Number 参数的方法是一样的:

public static void inspect2(Number u) {
}

inspect2(1);
inspect2(1.0);
inspect2(1.0f);

在泛型方法中使用有界类型参数(扩展)有什么好处?

注意不喜欢

List<Map<String, String>> vs List<? extends Map<String, String>> 

这些通用方法不需要/不需要任何子类型关系。

【问题讨论】:

标签: java generics generic-method


【解决方案1】:

在这种特殊情况下,没有区别,因为类型参数只是在一个地方用作参数类型。

在更复杂的情况下,类型参数是必要的。对于一些例子,

  • &lt;U&gt; U func(U x)
  • &lt;U&gt; void func(U x, List&lt;U&gt; y)
  • &lt;U extends Comparable&lt;U&gt;&gt; void func(U x)

【讨论】:

    【解决方案2】:

    您的问题没有很好地定义,因为您使用有界参数作为返回类型并尝试测试方法参数中的行为。

    这与泛型的差异有关,请参阅What is PECS (Producer Extends Consumer Super)?

    【讨论】:

      【解决方案3】:

      在我看来,如果您使用定义的U 类型作为参数类型没有任何优势。

      仅当您在多个参数(和/或返回类型)之间共享它时才有用。第一个例子:

      public static <U extends Number> U someFunc(U u) {
        U result = u; //do something else
        return result;
      }
      

      如果您使用Number 而不是U,您将丢失类型的信息。使用U 类型,当您使用它时,您可以执行以下操作:

      Long l = someFunc(1L);
      Integer i = someFunc(2);
      

      如果没有 U 类型,您将使用 Number 作为返回类型。

      其他例子:

      public static <U extends Number> void func(U u2, Class<U> u1) {
        //do something
      }
      

      【讨论】:

        猜你喜欢
        • 2019-07-24
        • 2011-11-05
        • 2016-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多