【问题标题】:What is difference between .toString() and (String) cast in JavaJava中的.toString()和(String)有什么区别
【发布时间】:2016-06-01 07:07:31
【问题描述】:

我想从返回Object 类型的会话对象中读取一个值。 我知道该对象具有 true/false 值。 我想将该值转换为 boolean 类型。所以我有以下代码。

session.getAttribute("MyKeyValue"); // It returns Object type

下面抛出异常。

boolean myBoolVal = Boolean.parseBoolean((String) session.getAttribute("MyKeyValue"));

下面的工作正常。

boolean myBoolVal = Boolean.parseBoolean(session.getAttribute("MyKeyValue").toString());

实际上,我不明白为什么选项 1 不起作用?

【问题讨论】:

标签: java classcastexception


【解决方案1】:

session.getAttribute("MyKeyValue") 返回的实例的运行时类型不是String 时,将其转换为String 会引发ClassCastException

另一方面,session.getAttribute("MyKeyValue").toString() 始终有效(假设session.getAttribute("MyKeyValue") 不为空),因为所有对象都实现了toString() 方法。

顺便说一句,由于session.getAttribute("MyKeyValue") 不返回String,它很可能返回Boolean(因为您希望Boolean.parseBoolean() 工作),所以如果是这种情况,而不是转换它到String,然后到Boolean,你可以把它转换成Boolean

Boolean myBoolVal = (Boolean) session.getAttribute("MyKeyValue");

【讨论】:

    【解决方案2】:

    您可以在会话对象中设置您想要的任何对象并将其关联到一个键。任何对象意味着任何类的任何对象。由于任何类都可能是Object 的间接子类,因此setget 中的类型为Object

    当您通过get 检索对象时,它只是简单地键入为Object,但肯定是某个子类。如果原始类不是String,(向下)将其转换为String 可能会失败(抛出异常,表示无法实现转换/转换)。您的选项 1 似乎就是这种情况。

    选项 2 有效,因为任何Object 实例都有一个方法toString(),可以调用该方法来获取对象的String 表示(主要用于在屏幕上显示它)。然后你parse那个表示(可能是"true""false")来获得一个boolean的值truefalse

    因此,如果您希望选项 1 起作用,因为您的对象可能是 Boolean 实例,您可以使用:

    boolean myBoolVal = (Boolean)session.getAttribute("MyKeyValue");
    

    【讨论】:

    • static 方法 Boolean.parseBoolean(String) 返回 boolean 而不是 Booleandocs.oracle.com/javase/8/docs/api/java/lang/…这里没有拆箱。
    • 另请注意,如果值为 null(当然,OP 的 toString-version 也是如此),拆箱将引发 NullPointerException。
    猜你喜欢
    • 1970-01-01
    • 2018-07-28
    • 2012-08-11
    • 1970-01-01
    • 2011-01-27
    • 2014-03-27
    • 2015-06-26
    • 1970-01-01
    相关资源
    最近更新 更多