在泛型类中实例化 Java 泛型类

皮瓣

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

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具有要型个人或亚型的?

是的,但这并不意味着 anScopy()方法返回的类型也是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>(); }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档