Что такое объекты CharBuffer с различным "типом элемента" (не равным по определению)?
equals()
метод CharBuffer
довольно сложно.
Отсюда я понял, что он выполняет сравнение char-by-char (или element-by-element???) следующего блока: from (начальная) позиция (возвращается position()
) включительно limit()
эксклюзив. Емкость и любое содержимое до позиции и после предела вообще не анализируются в обоих CharBuffer(s) методом equals().
Но фразы " один и тот же тип элемента " и "... элементы... точечно" бьют меня.
Два символьных буфера равны тогда и только тогда, когда
Они имеют одинаковый тип элемента,
Они имеют одинаковое количество оставшихся элементов, и
Две последовательности оставшихся элементов, рассматриваемые независимо от их начальных положений, точечно равны.
Что еще мне не хватает? Что такое тип элемента? Разве это не всегда символ внутри CharBuffer?
PS В соответствии с кодом реализации (Java SE8) фактически проверка типа (элемента) не выполняется в пределах equals(obj) - только стандартная проверка if (obj instanceof CharBuffer)
, Так что эта фраза в API предназначена только для будущей реализации или для "я не знаю, что". Или, может быть, "тот же тип элемента" просто означает, что равно (arg) - arg должен быть CharBuffer, что тривиально.
Не могли бы вы привести пример двух объектов CharBuffer с различным "типом элемента"?
Такие объекты CharBuffer не равны по определению.
CharBuffer cb1 = CharBuffer.allocate(10);
cb1.put('0');
cb1.put('a'); // element type - char ?
cb1.put('b');
cb1.rewind();
cb1.limit(7);
System.out.println(cb1);
CharBuffer cb2 = CharBuffer.allocate(11);
cb2.put("0ab"); // element type - String ?
cb2.rewind();
cb2.limit(7);
System.out.println(cb2);
// 0ab = 0ab + same number of "empty positions" until limit
// (don't know how to name "empty positions" correctly)
System.out.println(cb1.equals(cb2)); // TRUE
2 ответа
Нет, пример двух CharBuffer
экземпляры с разными типами элементов невозможны. Оскорбительный комментарий не является неправильным, но он может быть выведен из того факта, что тип элемента CharBuffer
всегда char
и это может рассматриваться как избыточное.
Я могу только строить догадки, но этот комментарий может быть призван прояснить, что ByteBuffer
не может быть равным, даже если его содержание можно рассматривать как char
(сквозь getChar()
, putChar()
, а также asCharBuffer()
методы).
Ваш вопрос очень актуален.
Если вы посмотрите на реализацию, то увидите, что проверка, связанная с типом элемента, не производится:
public boolean equals(Object ob) {
if (this == ob)
return true;
if (!(ob instanceof CharBuffer))
return false;
CharBuffer that = (CharBuffer)ob;
if (this.remaining() != that.remaining())
return false;
return BufferMismatch.mismatch(this, this.position(),
that, that.position(),
this.remaining()) < 0;
}
Единственная проверка, которая выполняется в отношении типа, заключается в том, что объект в параметре является экземпляром CharBuffer
,
Интересно отметить, что CharBuffer
происходит от Buffer
но это CharBuffer
Переопределение equals()
таким образом, где только экземпляр CharBuffer
может быть равным между ними.Buffer
реализации, такие как ByteBuffer
или же IntBuffer
так не совместимы между ними.
Согласно реализации, это, вероятно, означает, что.
Обратите внимание, что другие Buffer
реализации имеют сходство по этому вопросу:
У них одинаковый тип элемента