Если это делается для прокрутки к нижней части окна чата, сделайте следующий
, идея прокрутить конкретному отделению в чате была следующим
1), Каждое отделение чата, состоящее из Человека, время и сообщение, выполняется в для цикла с классом chatContentbox
2), querySelectorAll, находит все такие массивы. Это могли быть 400 узлов (400 чатов)
3) переходят к последнему
4) scrollIntoView ()
let lastChatBox = document.querySelectorAll('.chatContentBox');
lastChatBox = lastChatBox[lastChatBox.length-1];
lastChatBox.scrollIntoView();
Фундаментальная проблема заключается в очень примитивной системе типов Java.
Поскольку в Java нет понятия запечатанного набора типов (и Java не может вывести таких типов, как Haskell) невозможно создать общее Number + Number -> Number без обмана.
Для примитивов (и таких объектов, как Integer, которые могут быть автоматически сопоставлены с ними) продвижение типов и операция + является частью языка. (И это актуальная часть проблемы: что должно возвращать Number a + Number b, если a и b имеют разные типы?)
Если вам действительно нужно такое поведение, вам нужно будет найти (или создать) свой собственный класс, который либо использует отражение, либо серию (проверок и) приведения типов и тому подобное. Даже если вы используете универсальные шаблоны (помните, что универсальные типы стираются), необходимо выполнить приведение типов.
Насколько хорош вы хотите, чтобы результат был? Если ответ - «достаточно хорошо, в основном», то этого должно быть достаточно:
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
для обработки всех этих случаев - и, вероятно, поэтому его там нет.
Я не понимаю. Номер Java не есть метод добавления ...
Предположим, что java.lang.Number
действительно имеет метод или методы add
, как бы вы определили его подпись? Как бы вы определили его семантику? Как бы вы поступили с арифметикой «смешанного режима»?
Хотя, несомненно, можно ответить на эти вопросы и разработать API, результат, вероятно, будет сложно использовать правильно. Кроме того, очень необычно для приложения выполнять арифметические операции, не зависящие от представления. Обычно вы хотите / нуждаетесь в явном контроле над тем, как выполняется арифметика и происходят преобразования. (Правила продвижения примитивных типов Java уже достаточно сложны для понимания людьми !!)
В общем,
Лично я использую 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 - это число, поэтому возвращение одного значения не имеет.