无法获得可比较的接口工作

Can't get Comparable Interface Working

我正在开发线性 Evol.Algrm。我正在为我的基因组实施 'Comparable' 以简化评估;这是 class:

public class Chromosome extends Thread implements Comparable
{
    private String[] chromosome;
private double fitness;
private Random chromoGen;


public Chromosome(double[] candidate)
{        
    super();
    //encode candidate PER parameter; using Matrix as storage
    chromosome = encode(candidate);
}
//De-fault
public Chromosome()
{
    super();
}


public int compareTo(Chromosome c)
{
    return (fitness - c.fitness);
}

/**
 * Fitness stored in chromosome!
 */
public void setFitness()
{
    fitness = FF.fitness(this);
}

public double getFitness()
{
    return fitness;
}

/**
 * ENCODERS/DECODERS
 */
public String[] encode(double[] solution)
{
    //subtract 2^n from solution until you reach 2^-n

    /**
     * THE PRECISION IS [2^10 <-> 2^-8]!!!
     */
    double parameter = 0.00;
    String row = "";
    String[] encoded = new String[6];
    for (int j = 0; (j < 6); j++){
        parameter = solution[j];
        for (int i = 10; (i < (-8)); i--){
            if ((parameter - Math.pow(2, i)) >= 0){
                parameter = parameter - Math.pow(2, i);
                row += "1";
            }
            else{
                row += "0";
            }
        }
        encoded[j] = row;

        //refresh
        row = "";
    }

    return encoded;
}

public String encode(double sol)
{
    //subtract 2^n from solution until you reach 2^-n

    /**
     * THE PRECISION IS [2^10 <-> 2^-8]!!!
     */
    String row = "";

    for (int i = 10; (i < (-8)); i--){
        if ((sol - Math.pow(2, i)) >= 0){
            sol = sol - Math.pow(2, i);
            row += "1";
        }
        else{
            row += "0";
        }
    }

    return row;
}

public double decoded(int number)
{
    //returns UN-ENCODED solution
    double decoded = 0.00;
    String parameter = "";

    parameter = chromosome[number];
    for (int i = 10; (i < (-8)); i--){
        if (parameter.substring(i, (i+1)).equals("1")){
            decoded += Math.pow(2, i);
        }
    }

    return decoded;
}

/**
 * GETTERS
 * ---------------\/--REDUNDANT!!
 */
public double getParameter(int parameter)
{
    //decoded solution
    return decoded(parameter);
}

/**
 * Used in E-algrm.
 */
public String getRow(int row)
{
    //encoded solution
    return chromosome[row];
}

/**
 * SETTERS
 */
public void setRow(String encoded, int row)
{
    chromosome[row] = encoded;
}

public void setRow(double decoded, int row)
{
    chromosome[row] = encode(decoded);
}

/**
 * MUTATIONS IFF (mutate?)
 */
public void mutate(double mutationRate)
{
    //range of: 0-17
    int ran = 0;
    char[] temp;
    for (int m = 0; (m < 6); m++){
        temp = String.toCharArray(chromosome[m]);
        ran = chromoGen.nextDouble();
        if (ran <= mutationRate){
        }
    }
}
}

我的问题是,尽管我清楚地实施了比较方法;编译器仍然不高兴并说 'Must declare abstract or implement blah blah blah...'

有什么帮助吗?

您需要使您的 Comparable 成为通用接口,以便能够将 Chromosome 类型参数传递给 compareTo。这个应该implement Comparable<Chromosome>。否则 compareTo 方法必须是 Object 类型。

如果这是你的 class 签名:

public class Foo implements Comparable {

那么 compareTo 方法签名必须是:

public int compareTo(Object o) {

而且您必须在方法内部进行一些转换。另一方面,如果您的 class 签名是

public class Foo implements Comparable<Foo> {

那么 compareTo 方法签名必须是:

public int compareTo(Foo o) {

并且不需要转换。

作为附带建议,您不想扩展 Thread(尤其是当我没有看到您实现 public void run() 方法时),因为这会不必要地限制您的代码。最好实现 Runnable,并在需要时将其传递给 Thread 对象。