我正在 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");
}
}
In 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 有关吗?是因为默认方法的一些概念缺陷吗?它应该首先按照我想要的方式工作吗?第二块手表的奇怪结果是否与第一块手表的问题有某种关系?
在 JDK 8u40 之前,JDI(Java 调试器接口)、JDWP(Java 调试器有线协议)和 JDB(标准 Java 调试器)不支持默认和静态接口方法。这是错误 JDK-8042123,在 8u40 中记录为固定,并且相应的简介出现在8u40 发行说明.
更新到 8u40 或更高版本以解决此问题,至少在 JDK 端。
从错误描述来看,似乎还需要调试器端进行更改,以避免将 com.sun.jdi.InterfaceType 对象强制转换为 com.sun.jdi.ClassType,而是直接调用 InterfaceType.invokeMethod()。
在 IntelliJ 的具体情况下,Suseika 在评论中证实14.1.2 已经基本解决了这个问题(除了意外的拳击)迈克科比特仍然遇到这个问题在该版本上,带有 ClassCastException 表明上面的转换不正确。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)