java - Java中m1和m2泛型方法的区别
问题描述
有人可以帮我理解 m1() 和 m2() 通用方法之间的区别。
class C1 {
<T extends Number> void m1(List<T> list){
System.out.println(list);
for (T t : list){
System.out.println(t);
}
}
void m2(List<? extends Number> list){
for(Number n :list){
}
}
}
解决方案
这两个片段之间没有功能差异。它们做同样的事情,同样灵活,具有相同的签名,并且基本上编译成完全相同的类文件。
第一个片段说:有一些类型;我们对其进行限制,使其成为其中的一个java.lang.Number
或某个子类型。然后,这种类型出现了两次:一次作为列表上的类型参数(所以,它是一个数字列表,或者一个整数列表,或者一个双精度列表等),一次作为变量的类型,当我们遍历列表中的每个元素。关于 t 变量,你所能知道的for (T t : list)
只是它至少是,java.lang.Number
但你知道的就是这些。
在第二个片段中,您说:我们有一个列表,其中包含其中一个java.lang.Number
或任何子类型。我们对这个列表所做的只是迭代它,此时可以声明你可以确定当你迭代这个列表时掉出的项目至少是一个java.lang.Number
.
在这两种情况下,循环变量(T t
在第一个片段中,Number n
在第二个片段中)都被绑定为java.lang.Number
并且可以用作数字。
推荐阅读
- python-3.x - Selenium Wrapper 从下拉列表中随机选择一个元素(提供了下拉列表的位置(xpath,css,...))?
- javascript - React UseState - 使用先前的状态与不使用先前的状态
- php - 如何从sql数据库中获取多个字段并将它们显示到不同的html语句中
- mathematical-optimization - 用 Lingo 求解纯整数线性规划 (PILP)
- ffmpeg - 在静音轨道上合并两个音频文件
- linux - nginx背后的haproxy到静态html ssl获取真实IP地址
- flutter - ScanStreamTransformer 替代方案,每个事件调用一次,而不是每个侦听器调用一次
- bash - 带有不记名令牌的 cURL POST 请求导致“无法解析主机:POST”
- xamarin.forms - iOS(Xamarin Forms)中的高度按钮在文本标签换行时不调整大小(我想要动态大小)
- python-3.x - scipy.special.hyp1f1 的类型错误