在泛型类中实例化 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条评论
登录后参与评论

相关文章

来自分类Dev

Java泛型:如何为泛型类型化的类指定类类型?

来自分类Dev

Java泛型类工厂

来自分类Dev

Java中的泛型超类

来自分类Dev

在Dart中实例化泛型类

来自分类Dev

Java泛型-参数化的类与类型化方法

来自分类Dev

Java泛型调用自类说明

来自分类Dev

Java泛型-类本身的子类?

来自分类Dev

Java泛型的不兼容类

来自分类Dev

Java泛型改变类的字段和系列化

来自分类Dev

Java中的泛型类

来自分类Dev

如何在Java中创建泛型类的实例?

来自分类Dev

Java-实例化泛型类型的类

来自分类Dev

Java泛型:如何为泛型类型化的类指定类类型?

来自分类Dev

Java:使用泛型扩展类

来自分类Dev

实例化泛型类的JAVA数组

来自分类Dev

从Java中的枚举属性获取泛型类的实例

来自分类Dev

在Dart中实例化泛型类

来自分类Dev

阅读泛型类Java的注释

来自分类Dev

Java泛型类中的超类

来自分类Dev

在Kotlin中,如何使用本机Java参数实例化泛型类?

来自分类Dev

Java泛型类-如何理解?

来自分类Dev

java类中的多个泛型类型

来自分类Dev

Java:具有泛型方法的泛型类

来自分类Dev

使用参数化类的 Java 泛型问题

来自分类Dev

如何从泛型方法实例化 java 类

来自分类Dev

Java 泛型:如何在泛型接口中获取泛型类的 Id?

来自分类Dev

Java 泛型:如何扩展另一个泛型类的泛型类

来自分类Dev

java中泛型类中的非泛型构造函数

来自分类Dev

在java中扩展多个类的泛型