Java 中的 .toString() 和 (String) 有什么区别

What is difference between .toString() and (String) cast in Java

我想从 returns 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 不起作用?

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

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

顺便说一句,由于 session.getAttribute("MyKeyValue") 不是 return String,它 return 很可能是 Boolean(因为您期望 Boolean.parseBoolean() 工作),所以如果是这种情况,而不是将其转换为 String 然后转换为 Boolean,您可以将其转换为 Boolean :

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

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

中的 Object

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

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

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

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