假设我在泛型方法中有一个有界类型参数(来自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>>
这些通用方法不需要/需要任何子类型关系。
答案 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)
由于您使用有界参数作为返回类型并尝试在方法参数中测试行为,因此您的问题定义不明确。
答案 2 :(得分:0)
在这种特殊情况下,没有区别,因为type参数只是在一个地方用作参数类型。
在更复杂的情况下,类型参数是必需的。举个例子,
<U> U func(U x)
<U> void func(U x, List<U> y)
<U extends Comparable<U>> void func(U x)