Java 1.6. Ich habe eine Klasse um einige Methoden erweitert. Jetzt möchte ich die erweiterte Klasse anstelle der Basisklasse verwenden. Die Klassen, die die Basisklasse verwenden können, können die erweiterte Klasse jedoch nicht "erkennen". Was ist der (empfohlene) Fix?Verwenden Sie erweiterte Klasse anstelle der Basisklasse
Ich weiß, das wurde oft in verschiedenen Geschmacksrichtungen gefragt, aber ich kann es nicht bekommen!
Beispiel- Extend Klasse SAMRecord
und verwenden SAMRecordExt
Nachwort:
public class SAMRecordExt extends SAMRecord{
public SAMRecordExt(SAMFileHeader header) {
super(header);
}
}
Jetzt, während dies funktioniert:
SAMRecord rec= sam.iterator().next();
Das gibt mir einen Kompilierungsfehler
SAMRecordExt recext= sam.iterator().next();
>>> Type mismatch: cannot convert from SAMRecord to SAMRecordExt
Es überrascht nicht, diese funktioniert auch nicht (Laufzeitfehler):
SAMRecordExt recext= (SAMRecordExt) sam.iterator().next();
>>> Exception in thread "main" java.lang.ClassCastException: htsjdk.samtools.SAMRecord cannot be cast to markDupsByStartEnd.SAMRecordExt
at markDupsByStartEnd.Main.main(Main.java:96)
Wie kann ich die erweiterte Klasse arbeiten, wo die Basisklasse funktioniert?
EDIT: Weitere Informationen über die Klassen, die ich verwende. sam
Objekt stammt aus
SamReaderFactory sf = SamReaderFactory.makeDefault();
SamReader sam= sf.open(new File(insam));
Die vollständige Dokumentation ist https://samtools.github.io/htsjdk/javadoc/htsjdk/index.html
Can Sie geben die Deklaration der Variablen "sam" in dem obigen Code an –
Es scheint, dass diese Klasse mit der Superklasse verwendet werden sollte, was bedeutet: der Autor wusste von der Superklasse und benötigt die darin enthaltene Funktionalität. Nun, das Problem ist, wenn Sie versuchen, diese Umwandlung durchzuführen: Jede Instanz der Kindklasse ist eine Instanz der Superklasse, aber nicht jede Instanz der Superklasse ist eine Instanz der Kindklasse. – Stultuske
Es scheint mir, dass Sie nicht den Code ausführen, von dem Sie glauben, dass er ausgeführt wird, oder eher, dass Sie den von Ihnen geposteten Code nicht kompilieren. Sie sollten keine Kompilierungsfehler erhalten, vorausgesetzt, SAMRecordExt erweitert SAMRecord gemäß dem von Ihnen geposteten Code. – EJP