' U延伸某事' VS只是' Something'在有界类型参数中

时间:2015-03-11 10:19:59

标签: java generics generic-method

假设我在泛型方法中有一个有界类型参数(来自The Java™Tutorials的示例,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);

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

请注意,不喜欢

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

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

3 个答案:

答案 0 :(得分:0)

在我看来,如果您使用定义的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
}

答案 1 :(得分:0)

由于您使用有界参数作为返回类型并尝试在方法参数中测试行为,因此您的问题定义不明确。

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

答案 2 :(得分:0)

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

在更复杂的情况下,类型参数是必需的。举个例子,

  • <U> U func(U x)
  • <U> void func(U x, List<U> y)
  • <U extends Comparable<U>> void func(U x)