在泛型类中实例化Java Generic类

时间:2017-05-26 19:22:17

标签: java generics

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

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

这似乎令人困惑。隐而不宣&#39; extends关键字表示S必须是Individual类型或子类型?

2 个答案:

答案 0 :(得分:1)

方法copy()返回一个&#34; Individual&#34;类型的对象,该对象不能分配给&#34; S&#34;因为S是一个子类型。

为什么宣称女孩和男孩属于&#34; S&#34;而不是个人?

答案 1 :(得分:1)

  

这似乎令人困惑。隐而不宣&#39; extends关键字表示S必须是Individual类型或子类型?

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

}