在Java中,.toString()和(String)强制转换之间有什么区别?

4

我想从会话对象中读取一个返回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不起作用?


这里也许会感兴趣:https://dev59.com/hnRC5IYBdhLWcg3wVvjL - GhostCat
session.getAttribute("MyKeyValue").getClass() 的值是什么? - yelliver
2个回答

8
当使用session.getAttribute("MyKeyValue")方法返回的实例运行时类型不是String时,将其转换为String会抛出ClassCastException异常。与此相反,使用session.getAttribute("MyKeyValue").toString()则总是有效的(假设session.getAttribute("MyKeyValue")不为null),因为所有对象都有toString()方法的实现。
顺便说一下,由于session.getAttribute("MyKeyValue")不返回String,很可能它返回Boolean(因为您期望Boolean.parseBoolean()能够工作),所以如果是这种情况,您可以将其强制转换为Boolean而无需先将其转换为String再转换为Boolean
Boolean myBoolVal = (Boolean) session.getAttribute("MyKeyValue");

0

您可以在会话对象中设置任何对象,并将其与键关联。 任何对象都表示任何类的任何对象。 由于任何类都是可能间接的子类Object,因此类型为setget中的Object

当您通过get检索对象时,它仅被标记为Object,但肯定属于某个子类。 如果原始类不是String,则将其(down)转换为String可能会失败(抛出异常,说明无法实现强制转换/转换)。 这似乎是选项1的情况。

选项2有效,因为任何Object实例都有一个toString()方法,可以调用该方法以获取对象的String表示形式(主要用于屏幕上的演示)。 然后,您可以解析该表示形式(可能是"true""false"),以获得值为truefalseboolean

如果您想让选项1起作用,因为您的对象可能是一个Boolean实例,您可以使用以下代码:

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

static 方法 Boolean.parseBoolean(String) 返回一个 boolean 而不是 Boolean。http://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html#parseBoolean-java.lang.String- 这里没有自动拆箱。 - Stephen C
还要注意,如果值为null,则拆箱将抛出NullPointerException(当然,OP的toString版本也是如此)。 - Hulk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接