如何将字符串转换为 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?的主要内容,如果未能解决你的问题,请参考以下文章