为什么在将通用方法参数转换为特定参数时无法转换为类型?

Why getting unable to cast to type when casting generic method args to specific one?

我写了一个java科学计算器的代码,也写了jUnit测试it.Below是计算cubeRoot的方法

public <T> Double cubeRoot(T number){
    Double result= Math.cbrt((Double)number);
    return Math.abs(result);
}

方法returns正确的结果整数和双精度类型,但是当我为小数调用方法时,我传递的参数是双精度type.Following是上述方法的JUint测试。

public void testCalculateCubeRootWhenNegative(){
    Integer number=-64;
    assertEquals(-4.0,sci.cubeRoot(number));
}

public void testCalculateCubeRootOfdecimal(){
    Double number=0.40;
    assertEquals(0.736,sci.cubeRoot(number));
}

这是我正在使用的界面

public interface iScientific extends iMaths {
<T>Double squareRoot(T number);

<T>Double cubeRoot(T number);

无法找到解决错误的方法"java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double"

您正在尝试做这样的事情:

Integer i = Integer.valueOf(0);
Double d = (Double) i;

这不起作用,因为 i 不是 Double 的实例。

我建议更改您的 cubeRoot 方法以接受 NumberIntegerDouble 的基础 class):

public Double cubeRoot(Number number) {
  Double result = Math.cbrt(number.doubleValue());
  return Math.abs(result);
}

我又做了一些代码更改,使代码没有错误,因为最初的错误 persist.Check 我已经进行了更正,并建议对代码进行更多重构。

public Double cubeRoot(Number number){
    DecimalFormat df=new DecimalFormat("#.####");
    double result= Math.cbrt(number.doubleValue());
    return Double.valueOf(df.format(result));
}

并通过了以下测试。

public void testCalculateCubeRootWhenNegative(){
    Integer number=-64;
    assertEquals(-4.0,sci.cubeRoot(number));
}
public void testCalculateCubeRootOfdecimal(){
    Double number=0.40;
    assertEquals(0.7368,sci.cubeRoot(number));
}