8

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()、ブレークポイントを設定し、3 つのウォッチを設定します。

// 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 番目のウォッチは正常に実行されますが、不思議なことに、単にプリミティブではなく、ボックス化されたオブジェクトが報告されます 2

3 番目のウォッチは、予想どおりプリミティブ 1 を報告します。

最初の時計が機能しないのはなぜですか? これはバグですか?これは実際にIDEに関連していますか?デフォルトメソッドの概念上の欠陥が原因ですか? そもそも私が望むように機能する必要がありますか?2 回目のウォッチの奇妙な結果は、1 回目のウォッチの問題と何らかの関係がありますか?

4

1 に答える 1

8

JDK 8u40 より前は、デフォルトおよび静的インターフェース メソッドは、JDI (Java Debugger Interface)、JDWP (Java Debugger Wire Protocol)、および JDB (標準 Java デバッガー) でサポートされていませんでした。これはバグ JDK-8042123であり、8u40 で修正済みとして記録されており、対応する宣伝文句が8u40 リリース ノートに記載されています。

8u40 以降に更新して、少なくとも JDK 側でこの問題を修正してください。

バグの説明から、com.sun.jdi.InterfaceType オブジェクトを com.sun.jdi.ClassType にキャストするのを避けるために、デバッガ側の変更も必要なようですが、代わりに InterfaceType.invokeMethod() を直接呼び出します。

IntelliJ の特定のケースでは、Suseika はコメントで、14.1.2 で問題がほぼ修正されたことを確認しました(予期しないボックス化を除く) 。

于 2015-05-04T19:28:48.253 に答える