有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java正在创建泛型类型的对象

好的,这是我在这里的第一篇帖子,所以请容忍我。。 我正在做一个关于基因编程的小项目,我正在使用泛型

以下是一些小代码片段:

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);

}

二进制基因组表示一个基因组,它包含它表示的对象和位表示。我可以使用第一个构造函数,但第二个构造函数有问题。如果实现BinaryEncodable的每个类都有一个解码方法,那么是否可以从编码在第二个构造函数中创建对象C

我知道“new C()”由于类型错误而无法工作,但是否有某种工厂可以使用


共 (1) 个答案

  1. # 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方法