这是一个最小的代码示例。界面:

interface Individual<T>  {
    public T getVariableValue(int index) ;
    public void setVariableValue(int index, T value) ;

    public int getNumberOfVariables() ;
    public int getNumberOfObjectives() ;

    public Individual<T> copy() ;
}


和班级:

public class  minimalExample<S extends Individual> {

    private List<S> doCrossover(List<S> s){
        S mom = s.get(0);
        S dad = s.get(1);

        int crossoverPoint = 5;

        S girl = mom.copy();
        S boy = dad.copy();
        for (int i = 0; i < mom.getNumberOfVariables(); i++) {
            if(i > crossoverPoint){
                boy.setVariableValue(i, mom.getVariableValue(i));
                girl.setVariableValue(i,dad.getVariableValue(i));
            }
        }
        return s;
    }
}


如果我尝试对此进行编译,则会得到:

java: incompatible types: Individual cannot be converted to S


这似乎令人困惑。 extends关键字是否意味着S必须为个人类型或子类型?

最佳答案

这似乎令人困惑。 extends关键字是否意味着S必须为个人类型或子类型?


是的,但这并不意味着Scopy()方法返回的类型也是SIndividual接口仅要求它是Individual

此外,我观察到您的类minimalExample使用的是原始类型Individual,而它应该使用正确的参数化版本(否则,应将Individual设为非泛型)。

您可能在这里参数过多。 minimalExample真的需要使用S而不是直接使用Individual吗?显然,该示例类没有,但是启发问题的类也没有。

另一方面,如果确实需要特定类型Individual的参数,则可能需要进一步对该接口进行参数化,以描述其copy()方法返回的对象的类型:

interface Individual<T,I extends Individual<T, I>>  {
    public T getVariableValue(int index) ;
    public void setVariableValue(int index, T value) ;

    public int getNumberOfVariables() ;
    public int getNumberOfObjectives() ;

    public I copy() ;
}


然后,您可以使用所需的其他信息声明您的类MinimalExample

public class MinimalExample<T, S extends Individual<T, S>> {
    // ...
}


这是Individual的虚拟实现,可以与之配合使用:

public class ExampleIndividual<T> implements Individual<T, ExampleIndividual<T>> {

    public T getVariableValue(int index) { return null; }
    public void setVariableValue(int index, T value) {}

    public int getNumberOfVariables() { return 0; }
    public int getNumberOfObjectives() { return 0; }

    public ExampleIndividual<T> copy() { return new ExampleIndividual<T>(); }

}

关于java - 在泛型类中实例化Java泛型类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44208811/

10-09 04:50