Java 在字符串替换方法中使用CharSequence作为参数的原因

Java 在字符串替换方法中使用CharSequence作为参数的原因,java,Java,为什么String类中的某些方法的参数为CharSequence类型,而其他方法的参数为String类型,是否有逻辑上的解释? 例如: public String replace(CharSequence target, CharSequence replacement) 及 为什么replace方法不像startsWith方法那样使用字符串作为其参数 为什么String类中的某些方法的参数为CharSequence类型,而其他方法的参数为String类型,是否有逻辑上的解释 简短回答:向后兼

为什么String类中的某些方法的参数为CharSequence类型,而其他方法的参数为String类型,是否有逻辑上的解释? 例如:

public String replace(CharSequence target, CharSequence replacement)

为什么replace方法不像startsWith方法那样使用字符串作为其参数

为什么String类中的某些方法的参数为CharSequence类型,而其他方法的参数为String类型,是否有逻辑上的解释

简短回答:向后兼容性。

是在Java1.4中添加的

是在Java1.5中添加的,因此它可以使用已经存在的
CharSequence
类型

自Java 1.0以来就已存在,因此当时无法使用不存在的
CharSequence
类型,也无法在Java 1.4(或更高版本)中进行修改,因为这将导致向后兼容性问题

为什么replace方法不像startsWith方法那样使用字符串作为其参数

因此,您可以传递实现
CharSequence

CharSequence
除了实现可读字符序列的
String
类之外,还有更多的类,即类似于
String

接口
CharSequence
表示这些,请参见:

CharSequence
char
值的可读序列。该接口提供对多种不同类型字符序列的统一只读访问。[……]

目前已知的实现类有
CharBuffer
Segment
String
StringBuffer
StringBuilder
。正如您所看到的,
String
只是其中之一,还有更多


模块化 如果您的方法采用
CharSequence
,那么它的模块化程度要高得多,因为它还可以采用其他字符串类

显然,
CharSequence
的功能有点有限(请查看它提供的方法)。因此,并非所有类似字符串的方法都可以在
CharSequence
上完成。有时您需要
String
提供的额外功能,因此无法对
CharSequence
进行操作

这是一个非常基本的概念,就像一些事情可以在
动物身上做一样,但是其他事情,比如
树皮()
只能在
狗身上做


replace
startsWith
在您的具体示例中,原因实际上是向后兼容性

接口
CharSequence
是在Java1.4中添加的,它从一开始就不存在

然而,
startsWith
,虽然理论上它可以与
CharSequence
一起工作,但它已经添加到Java1.0中,目前还不可用

replace
是用java1.5添加的,因此
CharSequence
之后是一件事


由于向后兼容性,Java创建者不能只使用
编辑
startsWith
,而让它使用
CharSequence
。它必须继续使用有意义的
字符串

。我假设,根据您的回答,如果CharSequence是从Java 1.0开始出现的,那么它可能也会在startsWith方法签名中使用。向后兼容意味着Java1.5运行较旧版本的字节码。它不能保证新版本在1.0上运行。在1.5中,字符串是CharSequence。因此,理论上,从继承的角度来看,旧版本的字节码可以在新版本上运行。但我不确定这个具体的细微差别,也懒得做实验:)@FBI签名匹配在JVM加载字节码时也会发生,因为
startsWith(String)
startsWith(CharSequence)
是两种不同的方法,如果他们改变了方法,调用该方法的所有现有字节码都将失败,并出现
NoSuchMethodError
。当然,重新编译可以解决这个问题,但是Java的向后兼容性支持包括字节码级别的兼容性,因此如果不经历多年的不推荐警告,就无法删除现有方法。@Andreas感谢您的澄清。在本例中,我不确定字节码级别的行为。是的,我指的是字节码级的兼容性,否则就太明显了,无法重新编译所有内容:)
public boolean startsWith(String prefix)