Класс не является абстрактным и не переопределяет абстрактный метод в суперклассе - PullRequest
0 голосов
/ 11 июня 2018

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

Что такоеЯ здесь скучаю?

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

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

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

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

protected abstract void mutate(double mutationRate);

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

@Override
protected void mutate(double mutationRate){

}
0 голосов
/ 11 июня 2018

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

...