Что такое объекты CharBuffer с различным «типом элемента» (не равным по определению)? - PullRequest
0 голосов
/ 03 января 2019

Метод equals() для CharBuffer довольно сложен.

С здесь Я понял, что он делает char-by-char ( или поэлементно ???) сравнение следующего блока: от (начальной) позиции (возвращаемой 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 ]

0 голосов
/ 03 января 2019

Нет, пример двух CharBuffer экземпляров с различными типами элементов невозможен. Оскорбительный комментарий не является неправильным, но он может быть заключен из того факта, что тип элемента CharBuffer всегда char, и его можно рассматривать как избыточный.

Я могу только строить догадки, но этот комментарий может быть призван прояснить, что ByteBuffer не может быть равным, даже если его содержимое можно просмотреть как char (через getChar(), putChar() и asCharBuffer() методы).

0 голосов
/ 03 января 2019

Ваш вопрос очень актуален.
Если вы посмотрите на реализацию, вы увидите, что проверка, связанная с типом элемента, не выполняется:

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 имеют сходство по этому вопросу:

Они имеют один и тот же тип элемента

...