在枚举中实现内部接口时的循环继承 [英] Cyclic inheritance when implementing inner interface in enum

查看:15
本文介绍了在枚举中实现内部接口时的循环继承的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下实现会导致编译器错误:

I have the following implementation that gives a compiler error:

public enum FusionStat implements MonsterStatBuilderHelper {
    ATTACK {
        @Override
        public MonsterCard.MonsterCardBuilder safeCreateBuilder(final MonsterCard baseMonsterCard, final MonsterCard fusedMonsterCard, final FusionCard fusionCard) {
            Objects.requireNonNull(baseMonsterCard);
            Objects.requireNonNull(fusedMonsterCard);
            Objects.requireNonNull(fusionCard);
            if (baseMonsterCard.equals(fusedMonsterCard)) {
                throw new IllegalArgumentException("baseMonsterCard and fusedMonsterCard need to be different");
            }
            return new MonsterCard.MonsterCardBuilder(baseMonsterCard)
                    .attack(baseMonsterCard.getAttack() + (fusionCard.getFusionPower() * fusedMonsterCard.getAttack()));
        }
    },

    HITPOINTS {
        @Override
        public MonsterCard.MonsterCardBuilder safeCreateBuilder(final MonsterCard baseMonsterCard, final MonsterCard fusedMonsterCard, final FusionCard fusionCard) {
            Objects.requireNonNull(baseMonsterCard);
            Objects.requireNonNull(fusedMonsterCard);
            Objects.requireNonNull(fusionCard);
            if (baseMonsterCard.equals(fusedMonsterCard)) {
                throw new IllegalArgumentException("baseMonsterCard and fusedMonsterCard need to be different");
            }
            return new MonsterCard.MonsterCardBuilder(baseMonsterCard)
                    .maximumHitpoints((int)(baseMonsterCard.getMaximumHitpoints() + (fusionCard.getFusionPower() / 100d * fusedMonsterCard.getMaximumHitpoints())))
                    .hitpoints((int)(baseMonsterCard.getHitpoints() + (fusionCard.getFusionPower() / 100d * fusedMonsterCard.getHitpoints())));
        }
    };

    protected interface MonsterStatBuilderHelper extends MonsterStatBuilder {
        default MonsterCard.MonsterCardBuilder safeCreateBuilder(final MonsterCard baseMonsterCard, final MonsterCard fusedMonsterCard, final FusionCard fusionCard) {
            return createBuilder(baseMonsterCard, fusedMonsterCard, fusionCard);
        }
    }
}

@FunctionalInterface
interface MonsterStatBuilder {
    MonsterCard.MonsterCardBuilder createBuilder(final MonsterCard baseMonsterCard, final MonsterCard fusedMonsterCard, final FusionCard fusionCard);
}

它在第一行involving FusionStat给出了一个循环继承错误.

It gives a cyclic inheritance error on the first line involving FusionStat.

我不完全明白发生了什么.我首先实现了一个抽象类,并希望让枚举扩展它,直到我意识到枚举不能扩展类.现在我尝试 (ab) 使用 Java 8 中的默认方法.

I don't exactly see what is going on. I had first implemented an abstract class and wanted to let the enum extend that, until I realized that enums cannot extend classes. Now I try to (ab)use the default methods in Java 8.

我对为什么我的代码无法编译的思考过程很感兴趣,我试图通过在 safeCreateBuilder 中提取重复的代码来删除代码重复(仍然必须这样做).

I am interested in the thought process about why my code does not compile, I was trying to remove code duplication (still have to do so), by pulling the duplicated code inside safeCreateBuilder.

推荐答案

这是因为您正在从该类继承的类内部实现(编码)您正在实现(继承)的接口.

This would be because you are implementing (coding) the interface you are implementing (inheriting) inside of the class that is inheriting from that class.

我希望我能把这句话写得更好...

I wish I could make that sentence better...

但这是一个直观的例子.

But here is a visual example.

Class A implements Interface B {

    Interface B {
    }
}

据我所知,这是不允许的.您需要在类之外定义接口(在本例中为 Enum).

As far as I know, this is not allowed. You need to define the interface outside of the class (in this case, an Enum).

像这样:

Interface B {
}

Class A implements Interface B {
}

最佳做法可能是将它们分成不同的文件.

Best practice is probably to break them up into different files.

这篇关于在枚举中实现内部接口时的循环继承的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆