2016-06-05 15 views
2

Okay, das ist mein erster Beitrag hier so mit mir zu tragen .. Ich arbeite an einem kleinen Nebenprojekt über genetische Programmierung und ich verwende Generika.Erstellen von Objekt des generischen Typs

Dies sind kleine Code-Schnipsel:

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

}

Die BinaryGenome stellt ein Genom, enthält es das Objekt und die Bit-Darstellung darstellt. Ich kann den ersten Konstruktor verwenden, aber ich habe Probleme mit dem zweiten. Ist es möglich, ein Objekt C im zweiten Konstruktor aus der Codierung zu erstellen, vorausgesetzt, dass jede Klasse, die BinaryEncodable implementiert, über eine Decodiermethode verfügt.

Ich weiß, "New C()" funktioniert nicht wegen der Typfehler, aber gibt es eine Art von Fabrik, die ich verwenden kann?

Antwort

1

Sie einen Anbieter als Argument übergeben können:

public BinaryGenome(BitSet encoding, Supplier<C> supp) { 
    setGenome(encoding); 
    C c = supp.get(); 
    //... 
} 
BinaryGenome<SomeClass> bg = new BinaryGenome<>(encoding, SomeClass::new); 

Aber wirklich, die decode Methode ist besser als eine statische Factory-Methode auf SomeClass.

class SomeClass implements BinaryEncodeable<SomeClass> { 
    public static SomeClass decode(BitSet encoding) {...} 
} 
BinaryGenome<SomeClass> bg = new BinaryGenome<>(SomeClass.decode(encoding)); 

Beide Szenarien benötigen Sie sowieso den spezifischen Subtyp kennen.

Die zweite ermöglicht es sogar, den Typparameter loszuwerden.


Der Grund, warum BinaryGenome kann nicht nur ein Objekt vom Typ C, ist ein Mangel an Informationen konstruieren.

Zur Laufzeit, wegen der Löschung, der einzige Typ BinaryGenome weiß ist BinaryEncodable und BinaryEncodable weiß nichts über seine eigenen Unterklassen.

Ohne eine Instanz von C, die diese Art von Informationen enthält, gibt es keine Möglichkeit für BinaryGenome, was decode Methode zu nennen.

+0

In Ordnung, ich denke, ich werde mit dem Lieferanten gehen, da der zweite Konstruktor von einem anderen BinaryGenome -Objekt aufgerufen wird, das wiederum nicht weiß, welche statische Methode aufgerufen werden soll. –

Verwandte Themen