这是一个最小的代码示例。界面:
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类型或子类型?
答案 0 :(得分:1)
方法copy()返回一个&#34; Individual&#34;类型的对象,该对象不能分配给&#34; S&#34;因为S是一个子类型。
为什么宣称女孩和男孩属于&#34; S&#34;而不是个人?
答案 1 :(得分:1)
这似乎令人困惑。隐而不宣&#39;
extends
关键字表示S必须是Individual类型或子类型?
是的,但这并不意味着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>(); }
}