Class is not abstract and does not override abstract method in superclass

11,676

Solution 1

It looks like your abstract mutate method is not visible to the sub-class, since it has default access (which is package private), and the KnapsackIndividual sub-class is in a different package.

Change the abstract method to:

protected abstract void mutate(double mutationRate);

and change the overriding method accordingly:

@Override
protected void mutate(double mutationRate){

}

Solution 2

A concrete(non abstract) class must implement all non implemented (abstract) methods inherited from the parent class. You are implementing the same methods, but since they are private to the class they are not visible, and hence it is as if they are not implemented.

Share:
11,676
GioGio
Author by

GioGio

Hi There!

Updated on June 04, 2022

Comments

  • GioGio
    GioGio almost 2 years

    I am working on a generic implementation of the Genetic Algorithm. I'm trying to extend a specific Individual for the knapsack problem from the abstract class Individual

    package GenericGA;
    
    public abstract class Individual {
    
        private double fitness;
        private double probability;
    
    
        public double getFitness() {
            return fitness;
        }
    
        public double getProbability() {
            return probability;
        }
    
        public void updateProb(double totalFitness){
            probability = fitness/totalFitness;
        }
    
    
        abstract void updateFitness();
        abstract Individual crossover(Individual partner);
        abstract void mutate(double mutationRate);
    
    }
    

    This is the extended class

    package GenericGA.SpecificImplementations;
    
    
    import GenericGA.Individual;
    
    public class KnapsackIndividual extends Individual {
    
    
        void updateFitness(){
    
        }
    
        Individual crossover(Individual partner){
            return null;
        }
    
        void mutate(double mutationRate){
    
        }
    
        public static void main(String[] args){
            System.out.println("Hello");
        }
    
    }
    

    Since I was using intellij and it was giving me the error, I thought that could be a problem of the IDE, so I compiled with javac and I get the same error:

    GenericGA.SpecificImplementations.KnapsackIndividual is not abstract and does not override abstract method mutate(double) in GenericGA.Individual
    

    There are no spelling mistakes and the signatures are correct, and I get the error also for the other abstract methods when removing the mutate method that is giving the error.

    Moreover if I use @Override on top of the methods, it says

    Method does not override method from its superclass
    

    What am I missing here?

    Thanks in advance.

    • khelwood
      khelwood almost 6 years
      Your implementation class cannot override package-private abstract methods in Individual, because it is in a different package.