简体   繁体   中英

Why does my IDE say my piece of code isnt extending a method of its superclass, even though it is?

I've been using IntelliJ IDEA for my recent coding in java, especially Minecraft.

I tried extending the class AbstractSkeletonEntity which is an abstract class with one particular method that has been trouble for me recently:

abstract SoundEvent getStepSound();

in my own code, I try overriding the method:

public class SkeletonKnightEntity extends AbstractSkeletonEntity {



public boolean SkeletonCanSpawn = true;

public SkeletonKnightEntity(EntityType<? extends AbstractSkeletonEntity> entityType, World world) {
    super(entityType, world);

}

protected SoundEvent getAmbientSound() {
    return SoundEvents.ENTITY_WITHER_SKELETON_AMBIENT;
}

protected SoundEvent getHurtSound(DamageSource source) {
    return SoundEvents.ENTITY_WITHER_SKELETON_HURT;
}

protected SoundEvent getDeathSound() {
    return SoundEvents.ENTITY_WITHER_SKELETON_DEATH;
}

@Override
protected void playStepSound(BlockPos pos, BlockState state) {
    this.playSound(this.getStepSound(), 0.15F, 1.0F);
}

@Override
protected SoundEvent getStepSound() { return SoundEvents.ENTITY_WITHER_SKELETON_STEP;}
//^ here is the error

@Override
public void attack(LivingEntity target, float pullProgress) {

}
@Override
public void tickMovement() {
    super.tickMovement();
}
public static DefaultAttributeContainer.Builder createSKnightAttributes(){
    return HostileEntity.createHostileAttributes()

            .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.25D)
            .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 30)
            .add(EntityAttributes.GENERIC_ATTACK_DAMAGE, 1)

            ;
}
@Override
protected void initGoals() {
    this.goalSelector.add(3, new FleeEntityGoal(this, WolfEntity.class, 6.0F, 1.0D, 1.2D));
    this.goalSelector.add(5, new WanderAroundFarGoal(this, 1.0D));
    this.goalSelector.add(6, new LookAtEntityGoal(this, PlayerEntity.class, 8.0F));
    this.goalSelector.add(6, new LookAroundGoal(this));
    this.targetSelector.add(1, new RevengeGoal(this, new Class[0]));
    this.targetSelector.add(2, new FollowTargetGoal(this, PlayerEntity.class, true));
    this.targetSelector.add(3, new FollowTargetGoal(this, IronGolemEntity.class, true));
    this.targetSelector.add(3, new FollowTargetGoal(this, TurtleEntity.class, 10, true, false, TurtleEntity.BABY_TURTLE_ON_LAND_FILTER));
}
protected void dropEquipment(DamageSource source, int lootingMultiplier, boolean allowDrops) {
    super.dropEquipment(source, lootingMultiplier, allowDrops);
    Entity entity = source.getAttacker();
    if (entity instanceof CreeperEntity) {
        CreeperEntity creeperEntity = (CreeperEntity)entity;
        if (creeperEntity.shouldDropHead()) {
            creeperEntity.onHeadDropped();
            this.dropItem(Items.SKELETON_SKULL);
        }
    }

}
}

the IDE tells me for the code to work, i have to declare SkeletonKnightEntity abstract or implement the abstract method getStepSound() which i already did. when i try overriding the getStepSound() method, it tells me its not overriding anything from the superclass. does anyone know what could be causing this?

When you override a method, you can increase its visibility, but you can't decrease it. You took a public method and overrode it with a protected one. That isn't allowed. The superclass promised that that method can be called from anywhere, and you gave it a method that didn't meet that promise. Remove the protected modifier and you'll be just fine.

You didn't explicit say, so I'll include this for completeness. I'm assuming the parent method is public . If it really doesn't have a modifier (like your question shows), then it gets the default visibility of "package-private". A package-private method can't be accessed at all outside of the package it was defined in, so if the writer of that class made an abstract package-private method, then they intended that no one outside of the defining package is allowed to subclass their class, so you won't be allowed to either.

See this post for a summary of the visibility options in Java.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM