[英]Instantiate a Java Generic class in a generic class
这是一个最小的代码示例。 界面:
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具有要型个人或亚型的?
方法copy()返回类型为“个体”的对象,由于S是子类型,因此无法将其分配给类型“ S”。
为什么女孩和男孩被宣布为“ 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>(); }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.