Martin Buchholz wrote:
We would like to have return types of methods be the most covariant
as is reasonable. The only problem is compatibility.
For classes that cannot be subclassed by users,
changing covariant returns is almost 100% compatible.
(We all know that no change is 100.000000% compatible)
The spec for CharBuffer.CharSequence appears to guarantee that
the returned object is itself a CharBuffer, so all we need to
change is the return type:
Right, buffers are not extensible (no public or protected constructors,
etc.) so it does seem safe to take advantage of covariant returns.
There are a number of other "opportunities" in this package that Iris
and I have chatted about for jdk7. In particular the Buffer flip/etc.
methods come up quite often as the more specific return type would
facilitate better method invocation chaining. Are you interested in
doing those too? I ask because there are a couple of existing RFEs for
this (4774077 is the main one)? If not, then we can create a specific
bug for subSequence to let you get this done.
I see your String updates have a dependency on this. I've only glanced
at it so far but I assume by moving the casts you can separate this work
if required.
-Alan.
Hence:
diff --git a/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java
b/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java
--- a/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java
+++ b/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java
@@ -186,7 +186,7 @@
// --- Methods to support CharSequence ---
- public CharSequence subSequence(int start, int end) {
+ public CharBuffer subSequence(int start, int end) {
int pos = position();
int lim = limit();
assert (pos <= lim);
diff --git a/src/share/classes/java/nio/Direct-X-Buffer.java
b/src/share/classes/java/nio/Direct-X-Buffer.java
--- a/src/share/classes/java/nio/Direct-X-Buffer.java
+++ b/src/share/classes/java/nio/Direct-X-Buffer.java
@@ -391,7 +391,7 @@
// --- Methods to support CharSequence ---
- public CharSequence subSequence(int start, int end) {
+ public CharBuffer subSequence(int start, int end) {
int pos = position();
int lim = limit();
assert (pos <= lim);
diff --git a/src/share/classes/java/nio/Heap-X-Buffer.java
b/src/share/classes/java/nio/Heap-X-Buffer.java
--- a/src/share/classes/java/nio/Heap-X-Buffer.java
+++ b/src/share/classes/java/nio/Heap-X-Buffer.java
@@ -566,7 +566,7 @@
// --- Methods to support CharSequence ---
- public CharSequence subSequence(int start, int end) {
+ public CharBuffer subSequence(int start, int end) {
if ((start < 0)
|| (end > length())
|| (start > end))
diff --git a/src/share/classes/java/nio/StringCharBuffer.java
b/src/share/classes/java/nio/StringCharBuffer.java
--- a/src/share/classes/java/nio/StringCharBuffer.java
+++ b/src/share/classes/java/nio/StringCharBuffer.java
@@ -99,7 +99,7 @@
return str.toString().substring(start + offset, end + offset);
}
- public final CharSequence subSequence(int start, int end) {
+ public final CharBuffer subSequence(int start, int end) {
try {
int pos = position();
return new StringCharBuffer(str, -1,
diff --git a/src/share/classes/java/nio/X-Buffer.java
b/src/share/classes/java/nio/X-Buffer.java
--- a/src/share/classes/java/nio/X-Buffer.java
+++ b/src/share/classes/java/nio/X-Buffer.java
@@ -1245,7 +1245,7 @@
* If the preconditions on <tt>start</tt> and <tt>end</tt>
* do not hold
*/
- public abstract CharSequence subSequence(int start, int end);
+ public abstract CharBuffer subSequence(int start, int end);
// --- Methods to support Appendable ---