【问题标题】:why can't I override a public abstract method in an enum为什么我不能覆盖枚举中的公共抽象方法
【发布时间】:2012-07-18 01:42:11
【问题描述】:

我按照家庭作业的说明完成了以下代码:

public enum AccountType {
    Checking {
        @Override
        String acctType() { return "Checking Account"; }
    },
    Savings {
        @Override
        String acctType() { return "Saving Account"; }
    },
    CreditCard {
        @Override
        String acctType() { return "Credit Card Account"; }
    };

    abstract String acctType();
}

然而,最初,我尝试这样做:public abstract String acctType(); 并在每个被覆盖的方法上收到以下错误:

stringValue() in  cannot override stringValue() in AccountType; 
attempting to assign weaker access privileges; 
was public

所以我的问题是抽象方法上的 public 修饰符是怎么回事?枚举本身被声明为公共类,所以当两个 应该 似乎都是 public 时,我不明白分配较弱的访问权限

【问题讨论】:

    标签: java enums abstract


    【解决方案1】:

    错误消息意味着,如果您定义具有特定可见性的抽象方法,则必须将实现定义为至少具有该可见性。

    在这种特定情况下,这意味着如果抽象方法是公开的,那么实现也必须是公开的。

    public enum AccountType {
        Checking {
            @Override
            public String acctType() { return "Checking Account"; }
        },
        Savings {
            @Override
            public String acctType() { return "Saving Account"; }
        },
        CreditCard {
            @Override
            public String acctType() { return "Credit Card Account"; }
        };
    
        public abstract String acctType();
    }
    

    【讨论】:

    • 这被明确标记为作业问题 - 您不应该提供提示或至少是解释而不是完整的解决方案吗?
    • @Caspar 需要明确的是,上面的代码来自我已经完成的家庭作业......我只是好奇为什么我会遇到这种行为。我将它标记为家庭作业,因为它是作业的一部分,而且它并不是真正的关键任务代码
    • @DonRoby 感谢您的编辑和解释。这有点清楚了。我不认为将重写的方法声明为抽象的。
    • @HariSeldon 并不是我认为你让其他人为你做你的工作,而是我认为你可能想知道 发生了什么 以便你可以修复它自己。无论如何,Don 的编辑现在已经解决了这个问题 - Don 干得好。
    • @Caspar 我想我是按作者的意图读它的,也就是说,我认为这是一个他希望更好地理解的已经完成的作业。你是对的,如果没有这些知识,提示会比完整的解决方案更好。当然,在这种情况下,完整的解决方案很简单,写一个解释需要更多的时间。我完全打算在编辑中解释。
    猜你喜欢
    • 2011-08-31
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    相关资源
    最近更新 更多