【问题标题】:BigDecimal incompatible with ArrayList, java ClassCastExceptionBigDecimal 与 ArrayList 不兼容,java ClassCastException
【发布时间】:2017-02-27 21:40:47
【问题描述】:

我在 Eclipse 中调试另一个项目的一些代码,发现即使没有错误标志(只是警告),

try
    {   
        conn =  dss.connect();

        System.out.println("[SIGN]: Executing first step ");

        beanResultVO = executeFirstStep(usuario,conn,parametros,beanResultadoVO);

        if(beanResultVO.getResultCode() == IConstants.SWS_MSG_SUCCESSFUL){                          

            BigDecimal someCoolVar = (BigDecimal)beanResultVO.getResultObject();
            System.out.println("[SIGN]: end of the first step ");
            ((ArrayList)beanResultVO.getResultObject()).add(someCoolVar); // <--- WARNING HERE: The method add(Object) belongs to the raw type ArrayList. References to generic type ArrayList<E> should be parameterized
            saveStuff(conn);
        }
    }
    catch(Exception e)
    {
        System.out.println("error: "+e); // THIS SHOWS -->  java.math.BigDecimal incompatible with java.util.ArrayList
        e.printStackTrace();            
        beanResultVO.setResultCode(IConstants.SWS_MSG_ERROR);
        undoStuff(conn);
    }

一旦我执行到带有警告的行,它就会直接转到 try/catch 块中的异常,并显示以下消息:

java.math.BigDecimal 与 java.util.ArrayList 不兼容

这里是 beanResultVO

public class BeanResultadoVO  extends BeanBase{
    private int resultCode = 0;
    private String resultMessage;
    private Object resultObject;


    public int getResultCode() {
        return resultCode;
    }
    public void setResultCode(int resultCode) {
        this.resultCode = resultCode;
    }
    public String getResultMessage() {
        return resultMessage;
    }
    public void setResultMessage(String resultMessage) {
        this.resultMessage = resultMessage;
    }
    public Object getResultObject() {
        return resultObject;
    }
    public void setResultObject(Object resultObject) {
        this.resultObject = resultObject;
    }
}

现在,我已经尝试做

((ArrayList<BigDecimal>)beanResultVO.getResultObject()).add(someCoolVar);

得到不同的警告:

从 Object 到 ArrayList 的未经检查的强制转换

但同样的例外

【问题讨论】:

    标签: java arraylist classcastexception bigdecimal


    【解决方案1】:

    在 Java 中,所有转换操作都会被检查。当无法进行强制转换时,抛出 ClassCastException。在你的例子中

    beanResultVO.getResultObject()
    

    是 BigDecimal 的类型。 BigDecimal 不能转换为 ArrayList,因为 BigDecimal 不是 ArrayList 的超类。 如果你需要 ArrayList 你可以使用

    Arrays.asList(beanResultVO.getResultObject())
    

    Collections.singletonList(beanResultVO.getResultObject())
    

    它返回你想要的类型,即

    List<BigDecimal>
    

    【讨论】:

    • 一个愚蠢的问题:你为什么说它的 BigInteger?
    【解决方案2】:

    您的问题是 beanResultVO.getResultObject() 是 BigInteger,而不是 ArrayList。因此,当您尝试将其转换为 ArrayList 时,它会给您这个异常

    ((ArrayList)beanResultVO.getResultObject())
    

    【讨论】:

      【解决方案3】:

      代码永远不会运行,因为有

      BigDecimal someCoolVar = (BigDecimal)beanResultVO.getResultObject();
      

      前几行

      ((ArrayList)beanResultVO.getResultObject()).add(someCoolVar);
      

      beanResultVOresultObject 之间的resultObject 成员不能同时是ArrayListBigDecimal

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-09-22
        • 2014-03-12
        • 2013-10-29
        • 2019-09-05
        • 1970-01-01
        • 1970-01-01
        • 2014-08-26
        • 1970-01-01
        相关资源
        最近更新 更多