Интерфейс поставщика для ссылки на конструктор - PullRequest
0 голосов
/ 09 февраля 2020

следующий код

Supplier<String> newString = String::new;
System.out.println(newString.get());
// prints an empty string (nothing) to the console and then a newline character

и для определения метода get поставщика

T get()

метод get должен возвращать T, но конструктор не имеет возвращаемого типа, так почему String: : новое может быть назначено поставщику ?

Ответы [ 3 ]

2 голосов
/ 10 февраля 2020

Возможно, вы читали учебник Java относительно конструкторов , в котором говорится,

Объявления конструктора выглядят как объявления методов, за исключением того, что они используют имя class и не имеют возвращаемого типа.

Это тонко, но есть разница между этим предложением и оператором в OP.

... конструктор не имеет возврата type,

Обратите внимание, что в Учебном пособии говорится, что конструктор объявление не имеет возвращаемого типа, что немного отличается от того, что сам конструктор не имеет возвращаемого типа.

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

2 голосов
/ 09 февраля 2020

Я думаю, что два примера объяснят это, во-первых, вы хотели, чтобы поставщик содержательной строки печатал. Например,

Supplier<String> newString = () -> "test";
System.out.println(newString.get());

То, что вы предоставили , было пустой строкой. Например,

System.out.println(new String());

Совершенно верно создать пустую строку, даже если результат отклонился от ваших ожиданий.

Бонус третий пример, чтобы уточнить первый Например, в лямбда-выражении вы фактически реализуете единственный абстрактный метод из функционального интерфейса, в частности Supplier<T>. Мол,

Supplier<String> newString = new Supplier<String>() {
    @Override
    public String get() {
        return "test"; // originally return new String()
    }
};
System.out.println(newString.get());
0 голосов
/ 09 февраля 2020

вызов конструктора (new) создает объект и "return s", как вы видите.

Object object = new Object();

→ если конструктор ничего не возвращает, этот код был бы ложным. ..

Но это не так.

Таким образом, следующий пример в порядке

new Thread(new Runnable() {
  @Override public void run() {
    System.out.print("it runs.");
  }
}).start();
...