通用通配符有界类型与通用有界类型参数
Generic Wildcard Bounded Type vs Generic Bounded Type Parameter
在寻求理解 Java 泛型时,我遇到了这个:
public static <T extends Number> int sumListElems(List<T> list){
int total = 0;
for(Number n: list)
total += n.intValue();
return total;
}
假设我有以下添加列表元素的方法,仅限于包含数字的列表。
但是这段代码与这段代码有什么区别:
public static int sumListElems(List<? extends Number> list){
int total = 0;
for(Number n: list)
total += n.intValue();
return total;
}
它们都按预期编译和执行。这两者之间有什么区别?除了语法?我什么时候更喜欢使用通配符而不是前者?
嗯,是的,使用通配符方法,我不能在列表中添加除 null 之外的新元素,否则将无法编译。但除此之外呢?
在这种情况下没有区别。对于更复杂的签名,您可能需要重用已定义的类型,因此需要对其进行定义。类似于:
public static <T extends Number> void foo(T bar, List<T> myList)...
这不仅保证 bar
和 myList
的元素都扩展 Number,而且它们属于同一类型。你不能用其他语法强制执行它。
在寻求理解 Java 泛型时,我遇到了这个:
public static <T extends Number> int sumListElems(List<T> list){
int total = 0;
for(Number n: list)
total += n.intValue();
return total;
}
假设我有以下添加列表元素的方法,仅限于包含数字的列表。
但是这段代码与这段代码有什么区别:
public static int sumListElems(List<? extends Number> list){
int total = 0;
for(Number n: list)
total += n.intValue();
return total;
}
它们都按预期编译和执行。这两者之间有什么区别?除了语法?我什么时候更喜欢使用通配符而不是前者?
嗯,是的,使用通配符方法,我不能在列表中添加除 null 之外的新元素,否则将无法编译。但除此之外呢?
在这种情况下没有区别。对于更复杂的签名,您可能需要重用已定义的类型,因此需要对其进行定义。类似于:
public static <T extends Number> void foo(T bar, List<T> myList)...
这不仅保证 bar
和 myList
的元素都扩展 Number,而且它们属于同一类型。你不能用其他语法强制执行它。