Mik*_*uel 322

通过调用它的toString()方法.

以与此序列相同的顺序返回包含此序列中字符的字符串.字符串的长度将是该序列的长度.


fra*_*orl 87

这里有一个微妙的问题,有点像陷阱.

toString()方法有一个基本实现Object.CharSequence是一个界面; 虽然该toString()方法作为该接口的一部分出现,但在编译时没有任何内容会强制您覆盖它并遵守CharSequence toString()方法的javadoc对toString()方法施加的其他约束; 即它应该返回一个包含返回顺序的字符的字符串charAt().

您的IDE甚至不会通过提醒您可能应该覆盖来帮助您toString().例如,在intellij中,如果您创建一个新CharSequence实现,这将是您所看到的:http://puu.sh/2w1RJ.注意没有toString().

如果你依赖于toString()一个任意的CharSequence,它应该工作,只要CharSequence实施者正确地完成他们的工作.但是,如果你想完全避免任何不确定性,你应该使用StringBuilderappend(),就像这样:

final StringBuilder sb = new StringBuilder(charSequence.length());
sb.append(charSequence);
return sb.toString();
Run Code Online (Sandbox Code Playgroud)

  • **这个答案错了​​*`CharSequence`接口明确定义`toString()` - _implementor_不会错过这个.[javadoc](http://docs.oracle.com/javase/6/docs/api/java/lang/CharSequence.html#toString%28%29)声明"返回一个字符串,其中包含此序列中的字符与此序列相同的顺序.字符串的长度将是此序列的长度"自[1.4]开始以来(https://www.cs.duke.edu/csed/java/jdk1.4.2/docs/api/的java /郎/ CharSequence.html#的toString%28%29)._People,请验证你的upvote_ (19认同)
  • 你不应该犯错误/使你的代码变得更糟,因为其他人可能犯了错误. (9认同)
  • 返回新的StringBuilder(charSequence).toString(); 是单个衬垫等价物. (7认同)
  • 这太傻了.如果您不相信实施者遵守合同,则所有投注都将被取消.将它作为参数传递给`StringBuilder`也可能无法达到预期效果.任何其他接口都是如此,例如`List`或`Set`,特别是它们的`equals()`和`hashCode()`方法,它们将在没有覆盖的情况下进行编译,但*必须*根据契约覆盖. (2认同)
  • 接口这样做的事实在这方面可以说是一个糟糕的决定,我的回答只是强调这是一个比正常情况更容易发生人为错误的地方. (2认同)

Min*_*mal 17

最安全的方法

String string = String.valueOf(charSequence);
Run Code Online (Sandbox Code Playgroud)

让我们深入探讨

我们可以尝试使用 3 种常见方法将 a 转换CharSequenceString

  1. 类型铸造String string = (String) charSequence;
  2. 呼叫toString()String string = charSequence.toString();
  3. String.valueOf()方法String string = String.valueOf(charSequence);

如果我们运行这些,CharSequence charSequence = "a simple string";那么所有 3 个都会产生预期的结果。

当我们不确定 的性质时就会出现问题CharSequence。事实上,CharSequencean 是interface其他几个类实现的,例如String- CharBufferStringBuffer、 等。因此,将 a 转换String为 aCharSequence是一个简单的赋值操作,不需要强制转换或任何操作。但是,对于相反的Upcasting来说,事实并非如此。

如果我们确定 确实CharSequence是 的一个对象String,那么我们就可以使用选项 1——类型转换。否则,我们将得到一个ClassCastException. 在这种情况下,选项 2 和 3 是安全的。

另一方面,如果CharSequencenull,则选项 2 调用toString(),将给出NullPointerException

现在,在内部,方法在进行检查后String.valueOf()调用该方法。所以,这是最安全的方法。Java文档toString()null

如果参数为 null,则字符串等于“null”;否则,返回 obj.toString() 的值。


请注意:如果CharSequencenullthenString.valueOf()方法返回 string- "null",而不是nullvalue


Abh*_*tra 16

你可以直接使用String.valueOf()

String.valueOf(charSequence)
Run Code Online (Sandbox Code Playgroud)

虽然这与在实际调用toString之前toString()进行null检查相同charSequence.

当方法可以返回a charSequencenullvalue 时,这很有用.

  • 这实际上只是今天咬我.如果`charSequence`为null,则返回的字符串将为"null"而不是"null". (5认同)
  • 我认为这在某些情况下是完美的。 (2认同)