繁体   English   中英

Java中使用.toString()和(String)之间的区别是什么

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

我想从会话对象中读取一个返回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")返回的实例的运行时类型不是String ,将其强制转换为String会抛出ClassCastException

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

顺便说一句,因为session.getAttribute("MyKeyValue")没有返回一个String ,所以很可能它返回一个Boolean (因为你希望Boolean.parseBoolean()工作),所以如果是这样的话,而不是转换它到String然后再到Boolean ,你可以将它转换为Boolean

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

您可以在会话对象中设置所需的任何对象,并将其与关联关联。 任何对象都意味着任何类的任何对象。 由于任何类都是Object的可能间接子类,因此在setget键入Object

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

选项2的工作原理是因为任何Object实例都有一个方法toString() ,可以调用该方法来获取对象的String表示(主要用于屏幕上的表示)。 然后parse该表示(可能是"true""false" )以获取值为truefalseboolean值。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM