好的,这是我在这里的第一篇文章,所以请耐心等待。.我正在做一个关于基因编程的小型项目,正在使用泛型。
这些是小的代码段:
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代表一个基因组,它包含它代表的对象和位表示。我可以使用第一个构造函数,但是第二个构造函数却遇到了麻烦。假设每个实现BinaryEncodable的类都有一个解码方法,是否有可能通过编码在第二个构造函数中创建对象C。
我知道“ new C()”由于类型错误而不起作用,但是我可以使用某种工厂吗?
您可以将供应商作为参数传递:
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));
两种情况都要求您始终知道特定的子类型。
第二个甚至允许您摆脱type参数。
BinaryGenome
不能仅仅构造type对象的原因C
是缺乏信息。
在运行时,由于擦除,唯一的类型BinaryGenome
知道是,BinaryEncodable
而BinaryEncodable
对其自身的子类一无所知。
如果没有C
此类的实例保存此类信息,则无法BinaryGenome
知道decode
要调用的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句