PTT
Submit
Submit
选择语言
正體中文
简体中文
PTT
java
[问题] 请问泛型的问题
楼主:
jtorngl
(Pedrosa go!)
2020-08-29 12:31:55
请问 Collection 不支援 covariance (还是该说泛型不支援 covariance)
所以 summary 只能传入 List<Number> 的物件
而不能传入 List<Integer>、List<Double>, ...
public double summary(List<Number> nums) {
double total = 0;
for (Number num : nums) {
total += num.doubleValue();
}
return total;
}
为了让这段程式能达到类似 covariance 机制
所以会使用 wildcard
public double wildcardSummary(List<? extends Number> nums) {
double total = 0;
for (Number num : nums) {
total += num.doubleValue();
}
return total;
}
不过泛型使用 extends 一样可以做到不是吗
private <E extends Number> double genericsSummary(List<E> nums) {
double total = 0;
for (Number num : nums) {
total += num.doubleValue();
}
return total;
}
目前能想到的只有,wildcard 有 super 来达到 contravariance
但是泛型只支援 extends 而没有支援 super
那如果没有要 contravariance 的效果
有什么情况是 wildcard 才能做到,而泛型还是不能编译的?
目前看一些文章,在方法的参数,要限制参数型态边界时
几乎都是使用 List<? extends Number>
好像比较少看到 <E extends Number> ... List<E>
看了一下 JDK 的 List interface
boolean addAll(Collection<? extends E> c);
是因为限制的参数型态都是动态,才只能用 wildcard 吗?
补充一下,问这个问题主要是,目前开始接触 sonarcube 这类工具
对于程式会有很多规范,虽然目前还没去看是否有泛型语法的 issue
只是想先问一下,实际开发时,是否在需要限制参数边界时
一律使用 wildcard,而不要用泛型宣告
作者:
ssccg
(23)
2020-08-29 13:14:00
在你举的method参数,只用在一个地方的情况下,两个一样
https://docs.oracle.com/javase/tutorial/extra/generics/
methods.html 官方文件是建议在这个情况下用wildcardwildcard才能做到的如你说的就是下限(super),另外就是不需要type parameter可以直接用在field、local variable而generic的type parameter可以用在多个参数,可有多个上限
作者:
tw11509
(John-117)
2020-08-31 11:54:00
Producer Extends, Consumer Super 关键字,可以参考一下对我来说,通常不用去管泛型类别时,我会选择用wildcard,例如:Collections#swap,交换List中的元素根本不需要知道里面装了什么类别的元素
继续阅读
Re: [问题] 关于 Collection 的相关问题
gasbomb
Re: [问题]基础JAVA 空字串消不掉的原因
gasbomb
[问题]基础JAVA 空字串消不掉的原因
akk98
[应用] Java地图控制
carlosf1112
[问题] 关于 Collection 的相关问题
sam92260
[问题] 在树莓派3使用POI 无法执行
llzzyy01
[问题] 使用fortify扫瞄出system information le
lueichun
[问题] Kotlin的热潮几乎已经全部过去了?
dharma
[问题] 根据Service结果决定接下来的行为
Dong0129
[问题] 关于private的继承问题
awpadam
Links
booklink
Contact Us: admin [ a t ] ucptt.com