1

假设我在泛型方法中有一个有界类型参数(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>> 

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

4

3 回答 3

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
}
于 2015-03-11T10:39:58.620 回答
0

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

这与泛型中的差异有关,请参阅什么是 PECS(生产者扩展消费者超级)?

于 2015-03-11T10:49:25.590 回答
0

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

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

  • <U> U func(U x)
  • <U> void func(U x, List<U> y)
  • <U extends Comparable<U>> void func(U x)
于 2015-03-12T01:17:56.633 回答