繁体   English   中英

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

[英]Instantiate a Java Generic class in a generic class

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

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

方法copy()返回类型为“个体”的对象,由于S是子类型,因此无法将其分配给类型“ S”。

为什么女孩和男孩被宣布为“ S”类型而不是“个人”类型?

这似乎令人困惑。 没有按”的extends关键字意味着S具有要型个人或亚型的?

是的,但这并不意味着Scopy()方法返回的类型也是S Individual接口仅要求它是一个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>(); }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM