Как обработать числа универсальным способом?

Если это делается для прокрутки к нижней части окна чата, сделайте следующий

, идея прокрутить конкретному отделению в чате была следующим

1), Каждое отделение чата, состоящее из Человека, время и сообщение, выполняется в для цикла с классом chatContentbox

2), querySelectorAll, находит все такие массивы. Это могли быть 400 узлов (400 чатов)

3) переходят к последнему

4) scrollIntoView ()

let lastChatBox = document.querySelectorAll('.chatContentBox'); 
lastChatBox = lastChatBox[lastChatBox.length-1]; 
lastChatBox.scrollIntoView(); 
5
задан Community 23 May 2017 в 12:34
поделиться

4 ответа

Фундаментальная проблема заключается в очень примитивной системе типов Java.

Поскольку в Java нет понятия запечатанного набора типов (и Java не может вывести таких типов, как Haskell) невозможно создать общее Number + Number -> Number без обмана.

Для примитивов (и таких объектов, как Integer, которые могут быть автоматически сопоставлены с ними) продвижение типов и операция + является частью языка. (И это актуальная часть проблемы: что должно возвращать Number a + Number b, если a и b имеют разные типы?)

Если вам действительно нужно такое поведение, вам нужно будет найти (или создать) свой собственный класс, который либо использует отражение, либо серию (проверок и) приведения типов и тому подобное. Даже если вы используете универсальные шаблоны (помните, что универсальные типы стираются), необходимо выполнить приведение типов.

5
ответ дан 13 December 2019 в 19:31
поделиться

Насколько хорош вы хотите, чтобы результат был? Если ответ - «достаточно хорошо, в основном», то этого должно быть достаточно:

public Number myAdd(Number a, Number b){
     return a.doubleValue() + b.doubleValue();
}

Но если вы хотите что-то, что, скажем, соответствует семантике продвижения примитивов Java, вам, вероятно, придется написать это самостоятельно. А затем вам нужно будет выяснить, каковы правила для всех комбинаций «нестандартных» реализаций Number , включая BigDecimal , BigInteger , ] AtomicDouble , AtomicLong , все в org.apache.commons.lang.mutable и любые случайные реализации, которые кто-то может решить написать в следующий вторник.

Это не так. ясно, что в большинстве случаев делать правильно - преобразовать все в BigDecimal , например, это не вариант, если одним из аргументов является Apache Commons Fraction.ONE_THIRD ; кроме того, выполнение преобразования общим способом представляет те же проблемы, что и выполнение сложения обычным способом. Но наличие метода add () на Number потребовало бы каждой реализации Number для обработки всех этих случаев - и, вероятно, поэтому его там нет.

3
ответ дан 13 December 2019 в 19:31
поделиться

Я не понимаю. Номер Java не есть метод добавления ...

Предположим, что java.lang.Number действительно имеет метод или методы add , как бы вы определили его подпись? Как бы вы определили его семантику? Как бы вы поступили с арифметикой «смешанного режима»?

Хотя, несомненно, можно ответить на эти вопросы и разработать API, результат, вероятно, будет сложно использовать правильно. Кроме того, очень необычно для приложения выполнять арифметические операции, не зависящие от представления. Обычно вы хотите / нуждаетесь в явном контроле над тем, как выполняется арифметика и происходят преобразования. (Правила продвижения примитивных типов Java уже достаточно сложны для понимания людьми !!)

В общем,

3
ответ дан 13 December 2019 в 19:31
поделиться

Лично я использую BigDecimals почти для всего (но это в основном потому, что я работаю с валютными ценностями). Они обрабатывают все числовые значения любого размера. Из-за этого, на мой взгляд, они являются общими значениями и могут использоваться как таковые в вашем гипотетическом примере вместо абстрактного класса Number. Все можно превратить в BigDecimal, почему бы не использовать его?

public BigDecimal myAdd(BigDecimal a, BigDecimal b) {
    return a.add(b);
}

РЕДАКТИРОВАТЬ: Чтобы ответить на комментарий BigBrothers, приведенный ниже, вы всегда можете использовать метод doubleValue () для создания собственного универсального метода. Единственная проблема с этим состоит в том, что вы можете потерять точность в некоторых редких случаях, когда кто-то передает BigDecimal, и оно больше, чем Double.maxValue

public Number myAdd(Number a, Number b) {
    return new BigDecimal(a.doubleValue() + b.doubleValue());
}

BigDecimal - это число, поэтому возвращение одного значения не имеет.

-1
ответ дан 13 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: