这是一个最小的代码示例。界面:
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具有要型个人或亚型的?
是的,但这并不意味着 anS
的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>(); }
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句