如何使用java泛型类型参数?
两者之间有什么区别如何使用java泛型类型参数?,java,generics,Java,Generics,两者之间有什么区别 public static <T> double sums(Collection<T extends Number> numbers) {} 公共静态双和(集合号){ 还有这个 public static <T extends Number> double sums(Collection<T> numbers) {} public static double sums(Collection<? extends Nu
public static <T> double sums(Collection<T extends Number> numbers) {}
公共静态双和(集合号){
还有这个
public static <T extends Number> double sums(Collection<T> numbers) {}
public static double sums(Collection<? extends Number> numbers) {}
公共静态双和(集合号){
还有这个
public static <T extends Number> double sums(Collection<T> numbers) {}
public static double sums(Collection<? extends Number> numbers) {}
publicstaticdoublesum(Collection让我们把它们一一分解
这是胡说八道。不要这样做。它不会编译是有原因的
在这里,我们定义了一个通用函数sums
。我们的函数可以用一个包含某些特定数值类型元素的集合来调用
这与(2)类似。更多信息如下
这是(3)的一个奇怪版本。也不要这样做;您只是声明了一个类型参数而没有使用它,所以这没有什么意义
现在,(2)和(3)非常相似。当我们使用?
作为类型参数时,我们本质上是说“这可以是任何东西,但我并不特别关心它的值是什么”。另一方面,当我们显式使用t
时,我们可以使用该类型参数做其他事情。它是一个类型级别变量
public static <T extends Number> double sums(Collection<T> numbers) {
for (T arg : numbers) {
// Do something with arg
}
}
我们知道numbers
包含某些特定类型的数字,但我们不知道它是什么,因此我们必须回到更一般但仍然安全的numbers
最后一个变量根本不使用t
。?您的第一个变量没有编译。这将很有帮助:请尝试从问问题之前,谷歌,快乐编码!!可能重复而不是说无意义的代码你可以说为什么它是无意义的。还有它不会编译的原因。对于3和4,你不能向集合中添加任何东西,因为元素的类型是特定的,但未知。这个问题与PECS无关。我只是问关于类型参数和通配符的语法用法。@mcempire:“使用3和4,您无法向集合中添加任何内容”您可以将其传递给另一个具有签名#2的方法,该方法可以向集合中添加内容(尽管它只能将集合中的元素添加到自身,因为它不知道t
是什么),所以它可以间接地做任何事情#2可以做的事情。@newacct当然,这样做是可能的。人们也可以简单地键入它。