0

以下代码

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

以及 Supplier 获取方法的定义

T get()

get 方法应该返回 T,但是构造函数没有返回类型,那么为什么 String::new 可以分配给 Supplier <String>?

4

3 回答 3

2

我想两个例子可以解释它,首先你想要的是一个供应商来打印一个有意义的字符串。像,

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

提供的是一个空字符串。像,

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

产生一个空字符串是完全有效的,即使结果偏离了你的预期。

额外的第三个示例,详细说明第一个示例,在 lambda 表达式中,您实际上是从功能接口实现单个抽象方法Supplier<T>- 特别是. 像,

Supplier<String> newString = new Supplier<String>() {
    @Override
    public String get() {
        return "test"; // originally return new String()
    }
};
System.out.println(newString.get());
于 2020-02-09T16:27:18.663 回答
2

也许您一直在阅读有关构造函数的 Java 教程,其中指出,

构造函数声明看起来像方法声明——除了它们使用类的名称并且没有返回类型。

这很微妙,但是该句子与 OP 中的陈述之间存在差异。

...构造函数没有返回类型,

请注意,教程声明构造函数声明没有返回类型,这与说构造函数本身没有返回类型略有不同。

声明是语法;我们可以确认代码中确实没有显示返回类型。所以没有明确的返回类型。但是有一个隐式返回类型,它已经被声明为构造函数的名称。我们根本不需要在声明中重复返回类型,因为编译器可以从构造函数名称中推断出它。

于 2020-02-10T15:43:49.903 回答
0

如您所见,调用构造函数 ( new) 会创建一个对象并将其“ s”。return

Object object = new Object();

→ 如果构造函数不返回任何内容,则此代码为假...

但事实并非如此。

因此,下面的例子是可以的

new Thread(new Runnable() {
  @Override public void run() {
    System.out.print("it runs.");
  }
}).start();
于 2020-02-09T16:29:02.143 回答