【发布时间】:2017-09-23 12:22:45
【问题描述】:
考虑
String foo = s.toString();
对于非null java.lang.String 实例s。
这是定义为返回自身,还是取决于特定的 Java 实现?出于兴趣而采取“深拷贝”?
检查我的 JDK 源代码确认返回了 s,但 JLS 是否坚持这样做?我一直认为toString() 是任意序列化,可能代表对象,但不一定如此。例如,一个实现可以用引号字符包围字符串是完全合理的(至少在我看来)。
【问题讨论】:
-
toString()返回String表示Object。String比它自己更能代表StringObject吗? -
的确,这是一种理性的思考方式,但语言规范不一定是理性的。
-
你说的深拷贝是什么意思?
toString的行为在 JLS 中没有为String明确定义(但很明显,它应该返回自己)。然而,字符串内存操作是我希望在 JLS 或 JVM 规范中出现的东西......并且由于 String 是不可变的,所以制作任何副本都是没有意义的。 -
请注意,它可能不在JLS的范围内,给出覆盖方法的实现细节。
-
@Berger:通常情况下,我同意这是 JRE 问题而不是 JLS 问题,但 JVMS 和 JLS do 都提到了
java.lang.StringAFAIR,所以它可能在那里。 (我相信 JLS 也依赖于toString()。)
标签: java language-lawyer