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

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

问题描述

  public enum FusionStat实现MonsterStatBuilderHelper {
ATTACK {
@Override
public MonsterCard.MonsterCardBuilder safeCreateBuilder(最终的MonsterCard baseMonsterCard,最终的MonsterCard fusionMonsterCard,最终的FusionCard fusionCard){
Objects.requireNonNull(baseMonsterCard);
Objects.requireNonNull(fusedMonsterCard);
Objects.requireNonNull(fusionCard);
if(baseMonsterCard.equals(fusedMonsterCard)){
throw new IllegalArgumentException(baseMonsterCard and fusedMonsterCard需要不同);
}
返回新的MonsterCard.MonsterCardBuilder(baseMonsterCard)
.attack(baseMonsterCard.getAttack()+(fusionCard.getFusionPower()* fusedMonsterCard.getAttack()));
}
},

HITPOINTS {
@Override
public MonsterCard.MonsterCardBuilder safeCreateBuilder(最终的MonsterCard baseMonsterCard,最终的MonsterCard fusionMonsterCard,最终的FusionCard fusionCard){
Objects.requireNonNull(baseMonsterCard);
Objects.requireNonNull(fusedMonsterCard);
Objects.requireNonNull(fusionCard);
if(baseMonsterCard.equals(fusedMonsterCard)){
throw new IllegalArgumentException(baseMonsterCard and fusedMonsterCard需要不同);
}
返回新的MonsterCard.MonsterCardBuilder(baseMonsterCard)
.maximumHitpoints((int)(baseMonsterCard.getMaximumHitpoints()+(fusionCard.getFusionPower()/ 100d * fusedMonsterCard.getMaximumHitpoints())) )
.hitpoints((int)(baseMonsterCard.getHitpoints()+(fusionCard.getFusionPower()/ 100d * fusedMonsterCard.getHitpoints())));
}
};

保护接口MonsterStatBuilderHelper扩展MonsterStatBuilder {
默认MonsterCard.MonsterCardBuilder safeCreateBuilder(最终的MonsterCard baseMonsterCard,最终的MonsterCard fusionMonsterCard,最终的FusionCard fusionCard){
return createBuilder(baseMonsterCard,fusedMonsterCard,fusionCard) ;
$

$ b @FunctionalInterface
界面MonsterStatBuilder {
MonsterCard.MonsterCardBuilder createBuilder(Final MonsterCard baseMonsterCard,Final MonsterCard fusionMonsterCard,final FusionCard fusionCard);
}

它在第一行上给出循环继承错误涉及到FusionStat



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



我对思想过程感兴趣,为什么我的代码不能编译,我试图删除代码重复(仍然要这样做),通过在 safeCreateBuilder 中拉出重复的代码。

解决方案

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



我希望我能使这句话更好...



但这里是一个视觉示例。

  A类实现接口B {

接口B {
}
}

据我所知,这是不允许的。你需要定义界面以外的类(在这种情况下是枚举)。



像这样:

 接口B {
}

A类实现接口B {
}
/ pre>

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


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);
}

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

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.

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 {
    }
}

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

Like so:

Interface B {
}

Class A implements Interface B {
}

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

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

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