我想从会话对象中读取一个返回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不起作用?
答案 0 :(得分:8)
当session.getAttribute("MyKeyValue")
返回的实例的运行时类型不是String
时,将其转换为String
会抛出ClassCastException
。
另一方面,session.getAttribute("MyKeyValue").toString()
始终有效(假设session.getAttribute("MyKeyValue")
不为空),因为所有对象都具有toString()
方法的实现。
BTW,由于session.getAttribute("MyKeyValue")
没有返回String
,因此可能会返回Boolean
(因为您希望Boolean.parseBoolean()
能够正常工作),所以如果是这种情况,您可以将其转换为String
,而不是将其转换为Boolean
然后转换为Boolean
:
Boolean myBoolVal = (Boolean) session.getAttribute("MyKeyValue");
答案 1 :(得分:0)
您可以在会话对象中设置所需的任何对象,并将其与关联关联。任何对象都意味着任何类的任何对象。由于任何类都可能是Object
的间接子类,因此Object
和set
中的类型为get
。
当您通过get
检索对象时,它只是输入为Object
,但肯定属于某个子类。 (向下)将其转换为String
可能会失败(如果原始类不是String
,则会抛出异常,表示无法实现强制转换/转换)。似乎是你的选择1的情况。
选项2有效,因为任何Object
实例都有一个方法toString()
,可以调用该方法来获取对象的String
表示(主要用于屏幕上的表示)。然后,您parse
该表示(可能是"true"
或"false"
)获取boolean
值true
或false
。
因此,如果您希望选项1正常工作,因为您的对象可能是Boolean
实例,您可以使用:
boolean myBoolVal = (Boolean)session.getAttribute("MyKeyValue");