繁体   English   中英

Java 如果 Number 是 null,是否有任何优雅的方法可以为 Number 分配默认值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM