gpt4 book ai didi

debugging - Java调试器无法调用某些默认方法实现

转载 作者:行者123 更新时间:2023-12-03 06:48:05 25 4
gpt4 key购买 nike

我正在 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()

第一个 watch 抛出 NoSuchMethodException ,提示方法 Friendship$BasicFriend.sayHiTo() 不存在。

第二个 watch 运行成功,但奇怪的是它报告了一个装箱的对象{java.lang.Integer@537} "2" 而不仅仅是一个原始 2

第三个 watch 报告原始值 1,正如预期的那样。

为什么第一 block watch 不工作?这是一个错误吗?这实际上与 IDE 有关吗?是因为默认方法的一些概念缺陷吗?它应该首先按照我想要的方式工作吗?第二个 watch 的奇怪结果是否与第一个 watch 中的问题有某种关系?

最佳答案

在 JDK 8u40 之前,JDI(Java 调试器接口(interface))、JDWP(Java 调试器有线协议(protocol))和 JDB(标准 Java 调试器)不支持默认和静态接口(interface)方法。这是bug JDK-8042123 ,在 8u40 中记录为固定,相应的简介出现在 8u40 release notes 中。 .

更新到 8u40 或更高版本以解决此问题,至少在 JDK 端。

从错误描述来看,似乎还需要调试器端进行更改,以避免将 com.sun.jdi.InterfaceType 对象强制转换为 com.sun.jdi.ClassType,而是直接调用 InterfaceType.invokeMethod()。

在 IntelliJ 的具体情况下,Suseika confirmed in a comment 14.1.2 已基本解决了该问题(除了意外的拳击),不过 Mike Kobit still experiences this problem在该版本上,带有 ClassCastException 表明上面的转换不正确。

关于debugging - Java调试器无法调用某些默认方法实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30036474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com