java - 泛型中的通配符参数
问题描述
在下面的程序中,方法中的步骤ob.num.doubleValue()
是如何absEqual()
工作的?它想做什么?
class NumericFns<T extends Number>{
T num;
NumericFns(T n ){
num = n ;
}
boolean absEqual(NumericFns<?> ob) {
if (Math.abs(num.doubleValue())==
Math.abs(ob.num.doubleValue()))
return true ;
return false ;
}
}
public class demo {
public static void main(String[] args) {
NumericFns<Integer> iob = new NumericFns<Integer>(6) ;
NumericFns<Double> dob = new NumericFns<Double>(-6.0) ;
if(iob.absEqual(dob))
System.out.println("Absolute Values are equal") ;
else
System.out.println("They differ") ;
}
}
解决方案
类型参数T
有一个上限Number
,意味着它等于类型T
或其子类型。因此,您可以调用Number
类型变量的方法T
,例如在本例中的方法doubleValue()
。
请参阅有界类型参数说明。
因此,true
当且仅当两个数字的双精度值相同时,此方法才会返回。这可能是Integer
值 1 和Double
值 1.0 的情况。
请注意,方法实现可以简化为
boolean absEqual(NumericFns<?> ob) {
return Math.abs(num.doubleValue()) == Math.abs(ob.num.doubleValue()));
}
推荐阅读
- python - jupyter内核一直很忙,如何调试
- sql - 我可以添加值并获取日期差异的存储过程
- windows-7 - Win7:在启用 SCEP av 客户端的情况下切换用户/注销时出现黑屏?
- angular - (webpack)/buildin/module.js 模块构建失败:错误:ENOENT:没有这样的文件或目录,
- jenkins - 使用全局和文件夹 `\vars` Jenkins 库
- javascript - 从 MDN 文档导入 ES6 中的语句
- android - Android,行数
- c# - 在不阻塞 UI 的情况下执行工作时循环
- android - Room Dao 返回类型和 Retrofit api 返回类型不同(存储库模式需要相同的返回类型)
- ldap - 没有 LDAP 组与 Gerrit 关联