刚刚在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
谢谢
错误更新我在那里留下了一个分号,删除了它,请再次检查。
您打算对实现1::sendNotify;
行做什么?从implementation2.send通知();下面的
行判断,看起来您正在尝试调用上的
,它是这样写的:sendNotify
实现1
implementation1.sendNotification();
::
表示法是一个方法引用,并且(正如错误消息所说)它是一个标识符,而不是一个语句,因此它本身不能是一行。同样,您不能将实现1;
(变量)或ChildInterface;
(类标识符)作为语句编写。
。forEach(SomeInterfaceToBeRenamed::sendNotification)
行编译是因为您正在将方法引用传递给forEach()
,它反过来调用每个方法。
方法引用与方法调用不同。这是两件截然不同的事情。
>
方法调用是一个独立的表达式,或者更准确地说,是一个表达式语句。这意味着在您的示例中,正如您所期望的那样,sendNotification()可以正常工作。
然而,方法参考,
用于指方法的调用,而不实际执行调用
并且不是一个独立的表达式。它只能在也可以使用lambda表达式的情况下使用。作为独立表达式的方法引用不会编译,就像没有赋值的算术表达式一样(例如3 17;
)。这是由Java语言规范实施的,§
更多内容:
问题内容: 如您所知,有一个功能快捷方式的建议,因此您可以编写: 它将在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)方法参考