1. ホーム
  2. java

[解決済み] クラスが抽象化されておらず、スーパークラスの抽象化メソッドをオーバーライドしていない

2022-02-14 18:18:42

質問

Genetic Algorithmの汎用実装に取り組んでいます。 ナップザック問題のための特定の個体を、抽象クラス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){

}