Что такое объекты 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 реализации имеют сходство по этому вопросу:

У них одинаковый тип элемента

Другие вопросы по тегам