gpt4 book ai didi

java - 将 CharBuffer 和 StringBuilder 转换为超接口(interface)

转载 作者:行者123 更新时间:2023-11-29 06:34:18 25 4
gpt4 key购买 nike

StringBuilder 和 CharBuffer 都实现了 CharSequence 和 Appendable 接口(interface)。声明超接口(interface)时

 public  interface IAppendableCharSequence extends CharSequence, Appendable{}

然后我可以将 CharBuffer 转换为 IAppendableCharSequence,但不能转换为 StringBuilder:

 private IAppendableCharSequence m_buffer;

// ...

m_buffer = (IAppendableCharSequence) CharBuffer.allocate(512); // ok


m_buffer = (IAppendableCharSequence) new StringBuilder(512); // Cannot cast from StringBuilder to IAppendableCharSequence

这是为什么呢?谢谢!

最佳答案

这些都不会在运行时实际工作,但编译器允许一个而不是另一个的原因是 StringBuilderfinalCharBuffer 不是。

编译器肯定知道 instanceof StringBuilder 永远不可能是 IAppendableCharSequence 的有效实现,因为 StringBuilder 本身不实现该接口(interface),并且是 final 它不能有子类。因此,在任何情况下该转换都是合法的,并且编译器会拒绝它。

CharBuffer 的情况下,编译器没有这种保证,因为您可以创建 CharBuffer 的自定义子类,确实实现了IAppendableCharSequence

Java 语言规范中规定了编译器允许和不允许强制转换的规则,在本例中为 section 5.1.6 (缩小引用转换),除其他外,它允许转换

From any class type C to any non-parameterized interface type K, provided that C is not final and does not implement K

即从任何类类型到该类未实现的任何接口(interface)类型的转换都是有效的前提是该类不是最终的

关于java - 将 CharBuffer 和 StringBuilder 转换为超接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24528891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com