好的,这是我在这里发表的第一篇文章,请耐心等待.. 我正在开展一个关于遗传编程的小方案项目,我正在使用泛型。
这些是小代码片段:
public class BinaryGenome<C extends BinaryEncodeable<C>> {
public BinaryGenome(C encodable){
setGenome(encodable.encode());
setSpecification(encodable);
}
public BinaryGenome(BitSet encoding) {
setGenome(encoding);
//What comes here???
}
}
public interface BinaryEncodeable<C extends BinaryEncodeable<C>> {
public BitSet encode();
public C decode(BitSet encoding);
}
BinaryGenome代表一个基因组,它包含它所代表的对象和位表示。我能够使用第一个构造函数,但我遇到第二个问题。是否可以从编码中在第二个构造函数中创建对象C,因为实现BinaryEncodable的每个类都有一个解码方法。
我知道“新的C()”因为类型错误而无法正常工作但是我可以使用某种工厂吗?
答案 0 :(得分:1)
您可以将供应商作为参数传递:
public BinaryGenome(BitSet encoding, Supplier<C> supp) {
setGenome(encoding);
C c = supp.get();
//...
}
BinaryGenome<SomeClass> bg = new BinaryGenome<>(encoding, SomeClass::new);
但实际上,decode
方法作为SomeClass
上的静态工厂方法更好。
class SomeClass implements BinaryEncodeable<SomeClass> {
public static SomeClass decode(BitSet encoding) {...}
}
BinaryGenome<SomeClass> bg = new BinaryGenome<>(SomeClass.decode(encoding));
这两种情况都要求您了解特定的子类型。
第二个甚至允许你摆脱类型参数。
BinaryGenome
无法构建C
类型的对象的原因是缺乏信息。
在运行时,由于擦除,BinaryGenome
知道的唯一类型是BinaryEncodable
,而BinaryEncodable
对它自己的子类一无所知。
如果没有包含此类信息的C
实例,则BinaryGenome
无法知道要调用的decode
方法。