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




Конкретный (не абстрактный) класс должен реализовывать все нереализованные (абстрактные) методы, унаследованные от родительского класса. Вы реализуете те же методы, но, поскольку они являются частными для класса, они не видны, и, следовательно, как будто они не реализованы.
Похоже, ваш абстрактный метод mutate не виден подклассу, поскольку он имеет доступ по умолчанию (который является частным пакетом), а подкласс KnapsackIndividual находится в другом пакете.
Измените метод abstract на:
protected abstract void mutate(double mutationRate);
и соответственно измените метод переопределения:
@Override
protected void mutate(double mutationRate){
}
Ваш класс реализации не может переопределить частные абстрактные методы пакета в
Individual, потому что он находится в другом пакете.