【问题标题】:How assign a method reference value to Runnable如何将方法引用值分配给 Runnable
【发布时间】:2016-11-02 06:50:06
【问题描述】:

我有一个关于 Java 8 Runnable 的问题。

 public static void main(String[] args) {
    Runnable r1 = Test::t1;
    Runnable r2 = Test::t2;
    Runnable r3 = Test::t3;
}

public static void t1() {

}

public static String t2() {
    return "abc";
}

public static String t3(String t) {
    return t;
}

如代码所示,我理解r1 是对的,r3 是错的,但我不明白为什么r2 也是对的。谁能帮我理解一下?

【问题讨论】:

  • @YassinHajaj 嗯,你是对的!对不起,我失败了:)
  • @Hrabosch 没问题 :)
  • @Hrabosch,r3 错了,我就是不明白为什么 r2 是对的
  • @yijiang 我认为是因为您将方法引用调用为没有参数的静态方法,所以我不知道为什么会有问题。你知道我的意思吗?
  • @Hrabosch,众所周知,Runnable的run方法是没有参数和返回类型的,但是我代码中的t2()有返回类型,所以不知道为什么可以赋值到可运行 r2

标签: java runnable


【解决方案1】:

r2 很好,因为section 15.13.2 of the JLS,其中包括:

如果以下两个都为真,则方法引用表达式与函数类型一致:

  • 函数类型标识对应于引用的单个编译时声明。

  • 下列情况之一为真:

    • 函数类型的结果为void。
    • 函数类型的结果是 R,对所选编译时声明的调用类型 (§15.12.2.6) 的返回类型应用捕获转换 (§5.1.10) 的结果是 R' (其中 R 是可用于推断 R') 的目标类型,R 和 R' 都不是 void,并且 R' 在赋值上下文中与 R 兼容。

基本上,写t2();并忽略返回值是有效的,因此创建一个调用方法并忽略返回值的方法引用是有效的。

t3 有效,因为你必须提供一个参数,而Runnable 带一个参数,所以什么都没有“传递”给方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2012-04-09
    • 2021-05-19
    • 1970-01-01
    相关资源
    最近更新 更多