$ javac src/VisitorVersion.java && java VisitorVersion     (21.0.10+7-Ubuntu-124.04)
Card[last4=4242, amount=500] -> fee 10
Upi[vpa=ankur@bank, amount=500] -> fee 0
NetBanking[bank=HDFC, amount=500] -> fee 15

$ javac src/VisitorVersion.java && java VisitorVersion     (25.0.4.1+1-LTS)
Card[last4=4242, amount=500] -> fee 10
Upi[vpa=ankur@bank, amount=500] -> fee 0
NetBanking[bank=HDFC, amount=500] -> fee 15

$ javac src/VisitorVersion.java && java VisitorVersion     (27+35)
Card[last4=4242, amount=500] -> fee 10
Upi[vpa=ankur@bank, amount=500] -> fee 0
NetBanking[bank=HDFC, amount=500] -> fee 15

$ javac broken/VisitorAdded.java     (21.0.10+7-Ubuntu-124.04)
broken/VisitorAdded.java:9: error: Fee is not abstract and does not override abstract method visitWallet(Wallet) in Visitor
    static class Fee implements Visitor<Long> {
           ^
broken/VisitorAdded.java:13: error: Label is not abstract and does not override abstract method visitWallet(Wallet) in Visitor
    static class Label implements Visitor<String> {
           ^
2 errors

$ javac broken/VisitorAdded.java     (25.0.4.1+1-LTS)
broken/VisitorAdded.java:9: error: Fee is not abstract and does not override abstract method visitWallet(Wallet) in Visitor
    static class Fee implements Visitor<Long> {
           ^
broken/VisitorAdded.java:13: error: Label is not abstract and does not override abstract method visitWallet(Wallet) in Visitor
    static class Label implements Visitor<String> {
           ^
2 errors

$ javac broken/VisitorAdded.java     (27+35)
broken/VisitorAdded.java:9: error: Fee is not abstract and does not override abstract method visitWallet(Wallet) in Visitor
    static class Fee implements Visitor<Long> {
           ^
broken/VisitorAdded.java:13: error: Label is not abstract and does not override abstract method visitWallet(Wallet) in Visitor
    static class Label implements Visitor<String> {
           ^
2 errors
