如何将字符串转换为 CharSequence?

Posted

技术标签:

【中文标题】如何将字符串转换为 CharSequence?【英文标题】:How to convert a String to CharSequence? 【发布时间】:2010-11-26 09:24:15 【问题描述】:

如何在Java中将String转换为CharSequence

【问题讨论】:

这个问题有点荒谬。将 String 转换为 CharSequence 就像将长笛转换为乐器一样。字符串已经是 CharSequence。 String 类实现了 CharSequence 接口。 OP 的困惑可能源于不知道这对 program to an interface 意味着什么 @JeffScottBrown 这个问题实际上是有道理的,对于任何阅读 android 或 Java 文档并错过 CharSequence 不是类的细节的人来说,这都是一个合理的奇迹。您的评论对我有所帮助,但如果问题的措辞不是这样的话,我就不会找到它,并且花更多的时间寻找答案,而不是真正值得;) 我在一个 groovy 问题的背景下提出了这个问题:Exception groovy.lang.MissingMethodException: No signature of method: static java.util.regex.Pattern.matcher() is applicable for argument types: (java.lang.String) 以下是我建议@JeffScottBrown 改写他的评论的方法-“String 类实现 (IS-A) CharSequence 接口,因此您可以传入 String 来代替 CharSequence。就像您可以将长笛称为乐器,因为长笛是一种乐器” 【参考方案1】:

由于String IS-A 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,只需使用toString 的每个具体实现都必须实现的CharSequence 方法。

【讨论】:

除非你不能在没有显式转换的情况下将CharSequence 分配给String 修复了示例,谢谢。我的意思是相反,即将String 分配给CharSequence 你是对的。它确实是一个接口。但是,该代码不会实例化 CharSequence。它只是将String 的一个实例分配给CharSequence 变量,并且由于String 实现了CharSequence 接口,因此代码可以工作。 这不是答案。问题是 String -> to -> CharSequence。答案是相反的。 这两个都回答了。海报首先通过解释 String 是 CharSequence 来简单地解决 String -> CharSequence 问题。然后海报回答了如何从 CharSequence 到 String。【参考方案2】:

直接回答:

String s = "Hello World!";

// String => CharSequence conversion:

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

你可以使用

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

【讨论】:

欢迎来到 Stack Overflow Lucas。请提供比代码 sn-p 更多的解释。这对我们来说可能很明显,但请帮助其他人让他们知道为什么这段代码回答了这个问题。 将字符串包装到数组中无助于说明 String 是 CharSequence(因此 CharSequence 数组是 String 数组)。 CharSequence[] cs = new CharSequence[] "String to CharSequence";【参考方案5】:

这是个好问题!如果您调用使用泛型的 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);

【讨论】:

【参考方案6】:

试图通过发布我自己的麻烦来为 OP 的问题提供一些(可能的)上下文。我在 Scala 中工作,但是我收到的所有错误消息都引用了 Java 类型,而且错误消息的读法很像编译器抱怨 CharSequence not 是一个字符串。我在源码中确认了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: join an iterable of strings的答案来解决

总之,遇到类似问题的 OP 和其他人应该非常仔细地解析错误消息,看看可能涉及哪些其他类型转换。

【讨论】:

以上是关于如何将字符串转换为 CharSequence?的主要内容,如果未能解决你的问题,请参考以下文章

CharSequence 到 int

android 字符串

如何在editText.setText()中插入一个字符串

Android:无法转换为 java.lang.CharSequence

如何使用string.replace替换

是否可以在Firestore中保存CharSequence?