Java 1.6。我扩展了一个类来包含一些方法。现在我想用扩展类代替基类。但是,可以使用基类的类无法“识别”扩展类。什么是(推荐)修复?
我知道这已经多次被问过不同的口味,但我无法得到它!
示例 - 扩展课程SAMRecord
并使用SAMRecordExt
后跟:
public class SAMRecordExt extends SAMRecord{
public SAMRecordExt(SAMFileHeader header) {
super(header);
}
}
现在,虽然这有效:
SAMRecord rec= sam.iterator().next();
这给我一个编译错误
SAMRecordExt recext= sam.iterator().next();
>>> Type mismatch: cannot convert from SAMRecord to SAMRecordExt
不出所料,这也不起作用(运行时错误):
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)
如何让扩展类在基类工作的地方工作?
编辑:有关我正在使用的类的更多详细信息。 <{1}}对象来自
sam
完整文档为https://samtools.github.io/htsjdk/javadoc/htsjdk/index.html
答案 0 :(得分:3)
问题是:
sam.iterator().next()
返回SAMRecord
对象
这意味着
SAMRecordExt recext= sam.iterator().next();
将无效,因为超类无法分配给子类变量。
一般问题是子类比超类更具体 这就是为什么你不能将超类对象分配给一个subClass变量,因为超类不知道子类需要知道的事情。
另一方面,子类知道超类的细节以及更多细节,这意味着您可以将子类对象分配给超类变量。
解决问题的方法: (编辑)
通常你扩展类并且能够覆盖迭代器方法并返回一个你想要的类型的构造良好的迭代器。
但我在这里看到的问题是工厂创建了SamReader类型的obj,用于迭代SamRecords
SO - &GT;您必须扩展工厂以返回其他类型的SamReader并稍后在您希望的记录类型上进行迭代,请参阅
Factory类的源代码:
https://github.com/samtools/htsjdk/blob/master/src/java/htsjdk/samtools/SamReaderFactory.java