Я должен сделать фрагмент гистограммы

Java 8 разрешает статические методы интерфейса

С Java 8, интерфейсы могут иметь статические методы. У них могут также быть конкретные методы экземпляра, но не поля экземпляра.

здесь существует действительно два вопроса:

  1. Да ведь в плохие былые времена, разве взаимодействует через интерфейс, не мог содержать статические методы?
  2. , Почему статические методы не могут быть переопределены?

Статические методы в интерфейсах

не были никакой сильной технической причиной, почему интерфейсы, возможно, не имели статических методов в предыдущих версиях. Это подведено итог приятно плакатом из дублирующегося вопроса. Статические методы интерфейса первоначально рассмотрели как небольшое изменение языка, и затем было официальное предложение добавить их в Java 7, но это было позже , отбросил из-за непредвиденных сложностей.

Наконец, Java 8 представил статические методы интерфейса, а также сверхъездовые методы экземпляра с реализацией по умолчанию. У них все еще не может быть полей экземпляра все же. Этими функциями является часть поддержки лямбда-выражения, и можно читать больше о них в [1 110] Часть H JSR 335.

Переопределяющие статические методы

ответ на второй вопрос немного более сложен.

Статические методы разрешимы во время компиляции. Динамическая отправка имеет смысл, например, методы, где компилятор не может определить конкретный тип объекта, и, таким образом, не может разрешить метод для вызова. Но вызов статического метода требует класса, и так как тот класс известен статически — в компиляции time— динамическая отправка является ненужной.

Немного фона о том, как работа методов экземпляра необходима для понимания то, что продолжается здесь. Я уверен, что фактическая реализация очень отличается, но позвольте мне объяснить свое понятие отправки метода, какие модели наблюдали поведение точно.

Притворяются, что каждый класс имеет хеш-таблицу, которая отображает сигнатуры методов (имя и типы параметра) к фактическому блоку кода для реализации метода. Когда виртуальная машина пытается вызвать метод на экземпляр, она запрашивает объект для своего класса и ищет требуемую подпись в таблице класса. Если тело метода найдено, оно вызывается. Иначе родительский класс класса получен, и поиск повторяется там. Это продолжается, пока метод не найден, или больше нет родителя classes— который приводит к NoSuchMethodError.

, Если суперкласс и подкласс оба имеют запись в их таблицах для той же сигнатуры метода, с версией sub класса встречаются сначала, и версия суперкласса никогда не used— это - "переопределение".

Теперь, предположите, что мы пропускаем экземпляр объекта и только запускаемся с подкласса. Разрешение могло продолжиться как выше, дав Вам своего рода "переопределяемый" статический метод. Разрешение может все произойти во время компиляции, однако, так как компилятор начинает с известного класса, вместо того, чтобы ожидать до времени выполнения для запросов объекта неуказанного типа для его класса. Нет никакого смысла в "переопределении" статического метода, так как можно всегда указывать класс, который содержит требуемую версию.

Конструктор "интерфейсы"

Вот немного больше материала для обращения к недавнему редактированию к вопросу.

Это кажется, что Вы хотите эффективно передать под мандат подобный конструктору метод для каждой реализации IXMLizable. Забудьте о попытке осуществить это с интерфейсом в течение минуты и притвориться, что у Вас есть некоторые классы, которые отвечают этому требованию. Как Вы использовали бы его?

class Foo implements IXMLizable {
  public static Foo newInstanceFromXML(Element e) { ... }
}

Foo obj = Foo.newInstanceFromXML(e);

, Так как необходимо явно назвать конкретный тип Foo при "построении" нового объекта, компилятор может проверить, что действительно имеет необходимый метод фабрики. И если это не делает, и что? Если я могу реализовать IXMLizable, который испытывает недостаток в "конструкторе", и я создаю экземпляр и передаю его Вашему коду, это IXMLizable со всем необходимым интерфейсом.

Конструкция является частью реализации, не интерфейс. Любой код, который работает успешно с интерфейсом, не заботится о конструкторе. Любой код, который заботится о конструкторе, должен знать конкретный тип так или иначе, и интерфейс может быть проигнорирован.

5
задан Marc Gravell 20 August 2009 в 10:22
поделиться

2 ответа

Первый должен быть настраиваемым. Насколько я помню, вы можете сказать ReSharper, хотите ли вы иметь «это». перед только полями, методами, обоими или никакими.

Использование «var» ничего не изменит в сгенерированном коде CIL, поэтому производительность останется прежней. Я некоторое время не использовал ReSharper и не знаю, почему он так агрессивно продвигает анонимные типы, но одно из преимуществ var заключается в том, что он более устойчив к изменениям.

Имеется в виду, если вместо вызова Method.GetNumber (), вы вызвали оболочку, например. Фильтр (Method.GetNumber ()) в той же строке, которая возвращает значение Nullable, вам не придется обновлять тип переменной.

gif

Источник изображения

На практике это сопоставление, которое вы применили бы к пикселям изображения (псевдокод):

maxVal = image.maximumValue() # 153
minVal = image.minumumValue() # 84
dynamic = maxVal-minVal
for pixel in image.Pixels():
    newPixel = ((pixel-minVal)/dynamic)*255
9
ответ дан 14 December 2019 в 01:13
поделиться

Если у вас есть контроль над освещением и / или усилением / смещением камеры, вы можете оптимизировать их и растянуть гистограмму по своему желанию.

0
ответ дан 14 December 2019 в 01:13
поделиться
Другие вопросы по тегам:

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