这是一个最小的代码示例。界面:
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必须为个人类型或子类型?
是的,但这并不意味着S
的copy()
方法返回的类型也是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>(); }
}
关于java - 在泛型类中实例化Java泛型类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44208811/