Класс не является абстрактным и не отменяет абстрактный метод в суперклассе

Я работаю над общей реализацией генетического алгоритма. Я пытаюсь расширить конкретный объект Individual для задачи о рюкзаке из абстрактного класса 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);

}

Это расширенный класс

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

}

Поскольку я использовал intellij, и это давало мне ошибку, я подумал, что это может быть проблема IDE, поэтому я скомпилировал с помощью javac и получил ту же ошибку:

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

Орфографические ошибки отсутствуют, подписи верны, и я получаю сообщение об ошибке также для других абстрактных методов при удалении метода mutate, который вызывает ошибку.

Более того, если я использую @Override поверх методов, он говорит

Method does not override method from its superclass

Что мне здесь не хватает?

Заранее спасибо.


person GioGio    schedule 11.06.2018    source источник
comment
Ваш класс реализации не может переопределить частные абстрактные методы пакета в Individual, потому что он находится в другом пакете.   -  person khelwood    schedule 11.06.2018


Ответы (2)


Похоже, ваш абстрактный метод mutate не виден подклассу, поскольку он имеет доступ по умолчанию (который является частным пакетом), а подкласс KnapsackIndividual находится в другом пакете.

Измените метод abstract на:

protected abstract void mutate(double mutationRate);

и соответственно измените метод переопределения:

@Override
protected void mutate(double mutationRate){

}
person Eran    schedule 11.06.2018

Конкретный (не абстрактный) класс должен реализовывать все нереализованные (абстрактные) методы, унаследованные от родительского класса. Вы реализуете те же методы, но, поскольку они являются частными для класса, они не видны, и, следовательно, как будто они не реализованы.

person NiVeR    schedule 11.06.2018