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