【问题标题】:Why getting unable to cast to type when casting generic method args to specific one?为什么在将泛型方法参数转换为特定方法时无法转换为类型?
【发布时间】:2015-07-17 13:14:42
【问题描述】:

我写了一个科学计算器的java代码,也写了jUnit测试。下面是计算cubeRoot的方法。

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

方法返回正确的结果整数和双精度类型,但是当我调用十进制方法时,我传递的参数是双精度类型。以下是上述方法的 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”错误

【问题讨论】:

    标签: java junit4


    【解决方案1】:

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

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

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

    我建议将您的cubeRoot 方法更改为接受NumberIntegerDouble 的基类):

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

    【讨论】:

    • 谢谢你的建议。
    【解决方案2】:

    我再次做了一些代码更改以使代码无错误,因为最初的错误仍然存​​在。检查我所做的更正并建议对代码进行更多重构。

    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));
    }
    

    【讨论】:

    • 嗨,库尔米。本网站的运作方式与普通论坛不同。您在为问题的答案保留的空间中写了这个,但这不是答案。如果您有更多信息要添加到您的问题中,请编辑问题。如果您还有其他后续问题,请单独提出。有关详细信息,请参阅帮助页面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多