当前位置: 首页 > 知识库问答 >
问题:

双冒号运算符不适用于Java

万俟小林
2023-03-14

刚刚在java中尝试了一些东西,发现了以下问题。

DefaultAndStaticMethodMain.java:8: error: not a statement
        implementation1::sendNotification;
        ^
1 error

以下是我的代码。

父接口:

public interface ParentInterface {
    default void callForCompletion() {
        System.out.println("<<<< Notification sending completed. >>>>");
    }
}

子接口:

public interface ChildInterface extends ParentInterface {
    public abstract void sendNotification();

    static String printNotificationSentMessage() {
        return "Notification is sent successfully.";
    }
}

实施1:

public class Implementation1 implements ChildInterface {
    @Override
    public void sendNotification() {

        System.out.println("Implementation --- 1");
        System.out.println("Sending notification via email >>>");
    }
}

实施2:

public class Implementation2 implements ChildInterface {
    @Override
    public void sendNotification() {
        System.out.println("Implementation ---- 2.");
        System.out.println("Sending notification via SMS >>>");
    }
}

主要方法

public class DefaultAndStaticMethodMain {
    public static void main(String[] args) {
        Implementation1 implementation1 = new Implementation1();
        implementation1::sendNotification; // Compilation error as shown above.

        Implementation2 implementation2 = new Implementation2();
        implementation2.sendNotification();

        // Following works fine.
//        Arrays.asList(implementation1, implementation2).stream().forEach(SomeInterfaceToBeRenamed::sendNotification);
    }
}

我不确定我做错了什么,我在本地机器中安装了JDK 13并使用IntelliJ 2019.3和JDK 11。我检查了IntelliJ是否支持JDK 13

谢谢

错误更新我在那里留下了一个分号,删除了它,请再次检查。

共有2个答案

谭正谊
2023-03-14

您打算对实现1::sendNotify;行做什么?从implementation2.send通知();下面的行判断,看起来您正在尝试调用上的sendNotify实现1,它是这样写的:

implementation1.sendNotification();

::表示法是一个方法引用,并且(正如错误消息所说)它是一个标识符,而不是一个语句,因此它本身不能是一行。同样,您不能将实现1;(变量)或ChildInterface;(类标识符)作为语句编写。

。forEach(SomeInterfaceToBeRenamed::sendNotification) 行编译是因为您正在将方法引用传递给forEach(),它反过来调用每个方法。

汤嘉平
2023-03-14

方法引用与方法调用不同。这是两件截然不同的事情。

>

  • 方法调用是一个独立的表达式,或者更准确地说,是一个表达式语句。这意味着在您的示例中,正如您所期望的那样,sendNotification()可以正常工作。

    然而,方法参考,

    用于指方法的调用,而不实际执行调用

    并且不是一个独立的表达式。它只能在也可以使用lambda表达式的情况下使用。作为独立表达式的方法引用不会编译,就像没有赋值的算术表达式一样(例如3 17;)。这是由Java语言规范实施的,§

    更多内容:

    • 请解释Java 8方法对使用类名的实例方法的引用

  •  类似资料:
    • 问题内容: 如您所知,有一个功能快捷方式的建议,因此您可以编写: 它将在es5中像这样工作: 我的问题是:是否可以通过这种方式传递参数? 我的意思是用上述快捷方式编写此代码的方法: 这是React中很常见的模式,因此最好将其缩短一点。 问题答案: 否。bind运算符(规范建议)有两种形式: 方法提取 “虚拟方法”调用 obj::function(…) ≡ function.call(obj, …)

    • 问题内容: 我正在探索Java 8源代码,发现代码的这一特殊部分非常令人惊讶: 是类似方法指针的东西吗?普通方法如何转换为? 问题答案: 通常,可以使用以下方法调用该方法: 仅调用就需要很多语法。那就是lambda表达式起作用的地方。从Java 8开始,它允许以更短的方式执行相同的操作: 这是如何运作的?Java编译器“检测”你要实现一个接受两个ints并返回一个的方法int。这等效于接口的唯一方

    • 我在探索Java 8的源代码时,发现代码的这一部分非常令人惊讶: 是否类似于方法指针?普通的方法如何转换为?

    • 问题内容: 关于使用问号“?”的两个问题 在打印功能的括号内加上冒号“:”运算符:它们是做什么的?另外,有人知道它们的标准术语吗,或者在哪里可以找到有关它们使用的更多信息?我读过它们类似于’if’‘else’语句。 问题答案: 这是三元条件运算符,可以在任何地方使用,而不仅仅是print语句。它有时被称为“三元运算符”,但它不是唯一的三元运算符,而是最常见的一个。 这是Wikipedia的一个很好

    • 当使用双冒号操作符引用重载的方法时,Java似乎不能确定要使用的正确方法。考虑这个例子: 对 的第一次调用不会编译,并给出以下错误: 然而,第二个调用编译得很好,这意味着问题在于的重载。只有一个<code>setter</code>重载是适用的,所以我不明白为什么这不起作用。 可以通过使用指定参数类型的lambda来解决这个问题,但这要详细得多。 有更好的方法来处理这种情况吗?还是我一直在解决这个

    • 问题内容: 显然,Java中冒号以多种方式使用。有人介意解释它的作用吗? 例如这里: 您将如何以不同的方式编写此循环,以便不合并? 问题答案: 在Java代码中冒号有几个地方: 1)跳出标签): 2)三元条件: 3)每个循环: 4)断言: 5)切换语句中的情况: 6)方法参考