Nano Hash - криптовалюты, майнинг, программирование

Какой тип пустой Java Необязательный?

Дело в том, что я проверял Optional класс Java и заметил это в public static<T> Optional<T> empty() документе:

@param <T> The type of the non-existent value*.

И, посмотрев на весь класс и выполнив поиск здесь и на нескольких других страницах, я пришел к этим вопросам, на которые не смог ответить:

  1. Может ли пустой Optional иметь определенный тип? 1.1 Если да, то как это установить? 1.2 А есть ли способ проверить его тип?
02.10.2020

  • Параметр универсального типа не существует во время выполнения. Таким образом, тип пустого необязательного объекта - это просто Optional. Когда вам требуется пустой Optional<T>, компилятор может предположить, что общий тип T требуется для контекста; и это не вызывает проблем, потому что внутри него нет объекта неправильного типа. 02.10.2020
  • типа помехи откуда вам что хранить / назначать 02.10.2020
  • @Eklavya а что если не хранить? Весь тип несуществующего значения сбивает меня с толку. 02.10.2020
  • Считайте это расплывчатым, как (T) null (хотя не null). Причина того, что empty() является функцией, а не константой класса, заключается в том, что у вас есть типизированное значение Optional<T>. 02.10.2020
  • Я думаю, вы в первую очередь захотите изучить дженерики Java. В Optional нет ничего особенного, чего вы не найдете в других общих классах ... 02.10.2020
  • Он не отличается от List<String> list1 = Collections.emptyList(); List<Integer> list2 = Collections.emptyList();. Тип списков определяется только ссылочными переменными. Вот почему, что может быть удивительно, list1 == (Object)list2 будет true. То же самое для Function<String,String> f1 = Function.identity(); Function<Integer,Integer> f2 = Function.identity(); 05.10.2020

Ответы:


1

Класс Optional - это контейнер, который может содержать определенный элемент. Таким образом, он имеет две концепции:

  • Тип, который он содержит
  • Фактический объект, который он содержит

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

Чтобы ответить на ваши вопросы:

  1. При использовании Optional вы обычно определяете, что он, возможно, содержит тип, например:
Optional<String> optionalString;

На данный момент мы знаем, что optionalString может содержать String. Если мы сделаем это:

Optional<String> optionalString = Optional.empty();

На самом деле он ничего не содержит, но мы можем использовать его везде, где требуется Optional<String>.

  1. Тип Optional определяется его использованием. Как и выше, вы указываете Optional.empty() как Optional<String>. Вы также можете указать его тип через возвращаемое значение метода, например:
public Optional<Integer> findNumber() {
    return Optional.empty();
}
  1. Поскольку тип больше не присутствует во время выполнения, на данный момент невозможно проверить, что содержит необязательный параметр. Во время выполнения пустой Optional не имеет типа.
02.10.2020

2

Это любой тип, который вы укажете:

// Empty Optional with value type String
Optional<String> opt = Optional.empty();

Вот исходный код этого метода из OpenJDK 11:

    public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }

EMPTY - статический экземпляр (из исходного кода, ссылка на который приведена выше):

    /**
     * Common instance for {@code empty()}.
     */
    private static final Optional<?> EMPTY = new Optional<>();
02.10.2020

3

Я знаю, что ссылка на сообщение в блоге уже была размещена, но я всегда возвращаюсь к этому на странице: Baeldung Java Optional 8

На ваши вопросы:

  1. Необязательно может содержать любой тип объекта (если вам нужен int, используйте Integer)

  2. Optional.of(urObject) теперь тип Необязательный

  3. Нет, вы не можете проверить тип Необязательного.

02.10.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..