Java 1.6. Ho esteso una classe per includere alcuni metodi. Ora vorrei usare la classe estesa al posto della classe base. Tuttavia, le classi che potrebbero utilizzare la classe base non possono "riconoscere" la classe estesa. Qual è la correzione (raccomandata)?Utilizzare la classe estesa al posto della classe base
So che questo è stato chiesto molte volte in sapori diversi, ma non riesco a farlo!
Esempio- Estendere classe SAMRecord
e utilizzare SAMRecordExt
afterwords:
public class SAMRecordExt extends SAMRecord{
public SAMRecordExt(SAMFileHeader header) {
super(header);
}
}
Ora, mentre questo funziona:
SAMRecord rec= sam.iterator().next();
Questo mi dà un errore di compilazione
SAMRecordExt recext= sam.iterator().next();
>>> Type mismatch: cannot convert from SAMRecord to SAMRecordExt
Non sorprende, questo non funziona neanche (errore di runtime):
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)
Come posso fare funzionare la classe estesa dove ha funzionato la classe base?
MODIFICA: Ulteriori dettagli sulle classi che sto utilizzando. sam
oggetto proviene da
SamReaderFactory sf = SamReaderFactory.makeDefault();
SamReader sam= sf.open(new File(insam));
documentazione completa è https://samtools.github.io/htsjdk/javadoc/htsjdk/index.html
Can tu fornisci la dichiarazione della variabile "sam" nel codice sopra riportato –
Sembra che quella classe fosse pensata per essere usata con la super classe, il che significa: l'autore sapeva della super classe e aveva bisogno della funzionalità fornita in questo. Ora, il problema è che quando provi a fare quel cast: ogni istanza della classe child è un'istanza della super-classe, ma non tutte le istanze della super-classe sono un'istanza della classe child. – Stultuske
Mi sembra che tu non stia eseguendo il codice che pensi di essere in esecuzione, o piuttosto che non stia compilando il codice che hai postato. Non dovresti ricevere alcun errore di compilazione fornito 'SAMRecordExt estende SAMRecord' secondo il codice che hai postato. – EJP