【问题标题】:Anonymous classes extension匿名类扩展
【发布时间】:2013-06-06 13:42:12
【问题描述】:

当像下面这样声明一个匿名类时:

注意 ResourceBundle.Control 是一个具体的类。

摘自here的片段。

private static void test(Locale locale) {
    ResourceBundle rb = ResourceBundle.getBundle("ResourceBundle", locale,
         new ResourceBundle.Control() {
         @Override
         public List<Locale> getCandidateLocales(String baseName, Locale locale) {
             if (baseName == null)
             throw new NullPointerException();
             if (locale.equals(new Locale("it", "IT"))) {
             return Arrays.asList(
                 locale,
                 Locale.ITALY,
                 Locale.CHINESE ,
                 Locale.ROOT);
             } else if (locale.equals(Locale.GERMANY)) {
             return Arrays.asList(
                 locale.GERMANY,
                 // no Locale.CHINESE here
                 Locale.ROOT);
             }
             return super.getCandidateLocales(baseName, locale);
         }
         });

我基本上看到在声明匿名类时没有使用密钥extends。它认为这是理所当然的吗?如果是这样,什么时候适合在匿名类中使用extends

提前致谢。

【问题讨论】:

    标签: java class anonymous


    【解决方案1】:

    什么时候适合在匿名类中使用extends

    从来没有。关键字extends适用于命名类,除了扩展类外,还可以实现接口。相反,匿名类可以实现接口或扩展类,但不能同时实现。这就是语法根本没有关键字的原因 - 只需在 new 表达式后面加上花括号,并为基类或接口的方法提供实现。

    【讨论】:

    • +1。特别是匿名类不能实现多个接口。有时不方便。当你需要的时候,你需要创建一个“正确”的命名类。
    • @Thilo 我同意,这通常会给您带来不便。可以通过定义一个实现多个相关接口的抽象类并在不同情况下使用该类作为匿名类型的基础来在一定程度上缓解这种情况。 java swing 中的DefaultCellRenderer 类就是这个技巧的一个很好的例子,实现了AccessibleImageObserverListCellRendererMenuContainer。但是,有时你只需要几个接口,而没有命名类是无法获得的。
    • 因此它是隐式扩展的。谢谢
    • @Rollerball ...或隐式实现,如果类型名称表示接口。
    猜你喜欢
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多