创建泛型类型的对象

时间:2016-06-05 14:38:00

标签: java generics inheritance

好的,这是我在这里发表的第一篇文章,请耐心等待.. 我正在开展一个关于遗传编程的小方案项目,我正在使用泛型。

这些是小代码片段:

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()”因为类型错误而无法正常工作但是我可以使用某种工厂吗?

1 个答案:

答案 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方法。