我在 IntelliJ IDEA 中编码。在调试我的应用程序时,我不能在Watches中使用一些默认方法实现。
这是一个精简的例子:
public class Friendship {
interface Friend {
default void sayHiTo(Friend friend) {
System.out.println("Hi, " + friend.hashCode());
}
default int amountOfHands() {
return 2;
}
}
public static class BasicFriend implements Friend {
int numberOfFaces() {
return 1;
}
}
public static void main(String[] args) {
System.out.println("Put a breakpoint here");
}
}
在main()
方法中,我设置了一个断点并设置了三个手表:
// Default interface method with dependency
new BasicFriend().sayHiTo(new BasicFriend())
// Default interface method without dependency
new BasicFriend().amountOfHands()
// Class method
new BasicFriend().numberOfFaces()
第一个手表抛出NoSuchMethodException
抱怨该方法Friendship$BasicFriend.sayHiTo()
不存在。
第二个手表成功运行,但奇怪的是它报告了一个装箱的对象
{java.lang.Integer@537} "2"
,而不仅仅是一个原始的2
。
正如预期的那样,第三个手表报告了一个原始 1。
为什么第一只手表不工作?这是一个错误吗?这实际上与IDE有关吗?是因为默认方法的一些概念缺陷吗?它应该首先按照我的意愿工作吗?第二只手表的奇怪结果与第一只手表的问题有某种关系吗?