У меня есть следующий код, пытающийся использовать дополнительный класс:

import java.util.Optional;

// one class needs to have a main() method
public class HelloWorld
{
  public String orelesMethod() {
    return "hello";
  }

  public void test() {
    String value;
    value = Optional.ofNullable(null).orElse(orelesMethod());
    System.out.println(value); 
  }

  // arguments are passed using the text field below this editor
  public static void main(String[] args)
  {
    HelloWorld hello = new HelloWorld();

    hello.test();
  }
}

При компиляции он говорит:

incompatible types: Object cannot be converted to String
    value = Optional.ofNullable(null).orElse(orelesMethod());

Не могу разобраться в чем проблема, может кто-нибудь помочь с этим?

Спасибо!

0
ratzip 20 Авг 2018 в 16:30

3 ответа

Лучший ответ

Вы определили value для типа String, но Optional.ofNullable(null) возвращает Optional<Object>, потому что любой тип объекта может быть null, и вы не указали фактический тип. Затем вы вызываете orElse для объекта типа Optional<Object>, и поскольку T равен Object, метод orElse возвращает объект типа Object который не может быть преобразован в String.

Поэтому вам нужно указать тип при вызове ofNullable:

value = Optional.<String>ofNullable(null).orElse(orelesMethod());

Вы также можете использовать метод orElseGet, чтобы не вызывать orelesMethod, если необязательный параметр содержит значение.

6
awesoon 20 Авг 2018 в 13:40

Optional<T> - это новый (начиная с Java 8) способ обработки значений, которые могут быть null.

Вы получаете значение, вызывая .get().

Обратите внимание, что вызов .get() без установленного значения вызывает исключение NoSuchElementException.

См. Ссылку: Класс необязательный


Редактировать:

Кроме того, возвращаемое значение вашего orElse() будет соответствовать времени инициализации класса. Поскольку это не строка, а null, вы не получите строку в качестве возврата.

-3
Christian Hoffmann 20 Авг 2018 в 13:45

String - это Object, но Object не обязательно является String, и, следовательно, эта ошибка. Попробуй это :

public String orelesMethod() {
        return "hello";
    }
    public void test() {
        Object value;
        value = Optional.ofNullable(null).orElse(orelesMethod());
        System.out.println(value);
    }
0
Abhishek_Mishra 20 Авг 2018 в 13:36
51931835