如何将一个字符串(String)转换为字符序列(CharSequence)?

324

如何在Java中将String转换为CharSequence


27
这个问题有点毫无意义。将一个字符串转换为CharSequence就像将长笛转换为乐器一样。String本来就是CharSequence。String类实现了CharSequence接口。 - Jeff Scott Brown
4
楼主的困惑可能源于不知道什么是“面向接口编程”。 - Raedwald
14
@JeffScottBrown,这个问题实际上是有意义的,对于阅读Android或Java文档并错过CharSequence不是一个类这一细节的任何人来说,都会产生疑惑。你的评论对我很有帮助,但如果问题没有用这种方式表达,我可能就找不到它了,并且会浪费更多的时间寻找答案,而这并不值得。 - Kheldar
我在处理Groovy问题时遇到了这个问题:groovy.lang.MissingMethodException异常:没有适用于参数类型(java.lang.String)的静态java.util.regex.Pattern.matcher()方法的签名。 - BlackEye
以下是我建议@JeffScottBrown重新表述他的评论的方式:"String类实现(IS-A)CharSequence接口,因此您可以将String替换为CharSequence。这就像您可以将长笛称为乐器,因为长笛是乐器一样。" - Vighnesh
6个回答

302

String是一个CharSequence,因此您可以在需要CharSequence的任何地方传递String,或者将String分配给CharSequence:

CharSequence cs = "string";
String s = cs.toString();
foo(s); // prints "string"

public void foo(CharSequence cs) { 
  System.out.println(cs);
}
如果您想将一个CharSequence转换为String,只需使用每个CharSequence具体实现必须实现的toString方法即可。

16
除非进行显式转换,否则无法将CharSequence赋值给String - gustafc
1
我对这段代码"CharSequence cs = "string";"感到困惑。我们如何实例化一个CharSequence呢?它不是一个接口吗?(抱歉,我还在学习Java)。 - Mugen
4
你说得对。它确实是一个接口。然而,那段代码并没有实例化一个CharSequence。它只是将一个String实例赋值给一个CharSequence变量,由于String实现了CharSequence接口,所以代码可以工作。 - João Silva
7
这不是答案。问题是将字符串转换为CharSequence。答案是相反的。 - trante
4
这个问题有两个方面需要回答。首先,海报通过解释String是一个CharSequence类型来轻松解决了“String -> CharSequence”的问题。然后,海报回答了如何从CharSequence转换为String的问题。 - Alex A.
显示剩余2条评论

81
直截了当的回答:
String s = "Hello World!";

// String => CharSequence conversion:

CharSequence cs = s;  // String is already a CharSequence

CharSequence 是一个接口,String 类实现了 CharSequence 接口。


13

CharSequence是一个接口,String是它的实现之一,除了StringBuilder、StringBuffer和许多其他实现。

因此,就像您使用InterfaceName i = new ItsImplementation()一样,您可以使用CharSequence cs = new String("string")或简单地使用CharSequence cs = "string";


4
您可以使用

标签

CharSequence[] cs = String[] {"String to CharSequence"};

10
欢迎来到Stack Overflow,Lucas。请提供比代码片段更多的解释。对我们来说可能很明显,但是通过让别人了解为什么这段代码回答了问题,可以帮助他们。 - Jean-Rémy Revy
将字符串包装成数组并不能帮助说明String是CharSequence(因此CharSequence数组是String数组)。 - tishma
1
CharSequence[] cs = new CharSequence[] {"String 转 CharSequence"}; - avez raj

3

这是一个很好的问题!如果您调用使用泛型的API,并希望将结果分配或返回为通用类型的不同子类型,则可能会遇到麻烦。Java 8可以帮助转换:

    List<String> input = new LinkedList<>(Arrays.asList("a", "b", "c"));
    List<CharSequence> result;
    
//    result = input; // <-- Type mismatch: cannot convert from List<String> to List<CharSequence>
    result = input.stream().collect(Collectors.toList());
    
    System.out.println(result);

2
尝试通过发布自己的问题来为OP的问题提供一些(可能的)背景,我正在使用Scala,但是我收到的错误消息都引用了Java类型,并且错误消息读起来很像编译器抱怨CharSequence不是String。我在源代码中确认了String实现了CharSequence接口,但是错误消息强调了String和CharSequence之间的差异,同时隐藏了麻烦的真正来源。
scala> cols
res8: Iterable[String] = List(Item, a, b)

scala> val header = String.join(",", cols)
<console>:13: error: overloaded method value join with alternatives:
  (x$1: CharSequence,x$2: java.lang.Iterable[_ <: CharSequence])String <and>
  (x$1: CharSequence,x$2: CharSequence*)String
 cannot be applied to (String, Iterable[String])
       val header = String.join(",", cols)

我通过意识到问题不在于String/CharSequence,而是java.lang.Iterable和Scala内置Iterable之间的不匹配,成功解决了这个问题。
scala> val header = String.join(",", coll: _*)
header: String = Item,a,b

我的特定问题也可以通过Scala:连接字符串的可迭代对象中的答案来解决。

总之,原帖以及其他遇到类似问题的人应该仔细解析错误信息,并查看可能涉及的其他类型转换。


我在使用Scala的String.replace方法时遇到了类似的错误,尝试使用(Char)作为参数类型,但它需要两个参数。所以我添加了空字符串作为第二个参数(我认为这是默认值),并将第一个参数转换为字符串(因为它需要匹配CharCharSequence中的两个)。所以,我的错误就是没有仔细阅读参数类型选项而自己调用方法的另一个例子。 - combinatorist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接