[英]Java Is there any elegant way to assign a default value to Number if that Number is null
有没有办法为 Number 的派生 class 分配默认值,可以通过 int 传递?
我正在寻找一个实现:
public <N extends Number> N getNumberWithDefault( N number, int defaultNumber );
我知道这很容易:
public <N extends Number> N getNumberWithDefault(N number, Class<N> clazz, String defaultNumber) {
N result = number;
if (result == null) {
try {
result = clazz.cast(clazz.getDeclaredMethod("valueOf", String.class).invoke(null, defaultNumber));
} catch (Exception ex) {
LOGGER.error("Error assigning default", ex);
}
}
return result;
}
但它似乎一点也不优雅。 有什么办法可以改善吗?
我想知道的是是否可以做到这样的事情:
public <N extends Number> N getNumberWithDefault( N number ) {
return getNumberWithDefault( number, 1 );
}
然后,相同的 function (getNumberWithDefault(number)) 可用于所有类。
虽然我认为这种方式在 Java 中是不可能的
类型安全的方法虽然不优雅,但使用重载代替 generics。
优点是如果需要,默认值可以是非int
。
public Byte getNumberWithDefault(Byte number, int defaultNumber) {
return (number != null ? number : Byte.valueOf((byte) defaultNumber));
}
public Short getNumberWithDefault(Short number, int defaultNumber) {
return (number != null ? number : Short.valueOf((short) defaultNumber));
}
public Integer getNumberWithDefault(Integer number, int defaultNumber) {
return (number != null ? number : Integer.valueOf(defaultNumber));
}
public Long getNumberWithDefault(Long number, long defaultNumber) {
return (number != null ? number : Long.valueOf(defaultNumber));
}
public Float getNumberWithDefault(Float number, float defaultNumber) {
return (number != null ? number : Float.valueOf(defaultNumber));
}
public Double getNumberWithDefault(Double number, double defaultNumber) {
return (number != null ? number : Double.valueOf(defaultNumber));
}
public BigInteger getNumberWithDefault(BigInteger number, long defaultNumber) {
return (number != null ? number : BigInteger.valueOf(defaultNumber));
}
public BigDecimal getNumberWithDefault(BigDecimal number, double defaultNumber) {
return (number != null ? number : BigDecimal.valueOf(defaultNumber));
}
对于更新后的问题,默认值被硬编码为1
,答案是相同的。
public Byte getNumberWithDefault(Byte number) {
return (number != null ? number : Byte.valueOf((byte) 1));
}
public Short getNumberWithDefault(Short number) {
return (number != null ? number : Short.valueOf((short) 1));
}
public Integer getNumberWithDefault(Integer number) {
return (number != null ? number : Integer.valueOf(1));
}
public Long getNumberWithDefault(Long number) {
return (number != null ? number : Long.valueOf(1L));
}
public Float getNumberWithDefault(Float number) {
return (number != null ? number : Float.valueOf(1f));
}
public Double getNumberWithDefault(Double number) {
return (number != null ? number : Double.valueOf(1d));
}
public BigInteger getNumberWithDefault(BigInteger number) {
return (number != null ? number : BigInteger.ONE);
}
public BigDecimal getNumberWithDefault(BigDecimal number) {
return (number != null ? number : BigDecimal.ONE);
}
我认为解决此问题的唯一方法是将方法的签名更改为
public <N extends Number> N getNumberWithDefault( N number, N defaultNumber )
也就是说,defaultNumber 必须与 number 的类型相同。
当然,那么它很简单:
public <N extends Number> N getNumberWithDefault( N number, N defaultNumber ){
return number != null ? number : defaultNumber;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.