使用扩展类代替基类

dar*_*ber 5 java extends class type-mismatch

Java 1.6.我扩展了一个类来包含一些方法.现在我想用扩展类代替基类.但是,可以使用基类的类无法"识别"扩展类.什么是(推荐)修复?

我知道这种情况已被多次提出不同的口味,但我无法得到它!

示例 - 扩展类SAMRecord并使用SAMRecordExt后缀:

public class SAMRecordExt extends SAMRecord{

    public SAMRecordExt(SAMFileHeader header) {
        super(header);
    }       

}
Run Code Online (Sandbox Code Playgroud)

现在,虽然这有效:

SAMRecord rec= sam.iterator().next();
Run Code Online (Sandbox Code Playgroud)

这给了我一个编译错误

SAMRecordExt recext= sam.iterator().next();
>>> Type mismatch: cannot convert from SAMRecord to SAMRecordExt
Run Code Online (Sandbox Code Playgroud)

不出所料,这也不起作用(运行时错误):

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)
Run Code Online (Sandbox Code Playgroud)

如何使扩展类在基类工作的地方工作?

编辑:关于我正在使用的类的更多细节.sam对象来自

SamReaderFactory sf = SamReaderFactory.makeDefault();
SamReader sam= sf.open(new File(insam));
Run Code Online (Sandbox Code Playgroud)

完整文档是https://samtools.github.io/htsjdk/javadoc/htsjdk/index.html

Zel*_*don 3

问题是:

sam.iterator().next()
Run Code Online (Sandbox Code Playgroud)

返回一个SAMRecord对象

意思是

SAMRecordExt recext= sam.iterator().next();
Run Code Online (Sandbox Code Playgroud)

不起作用,因为超类不能分配给子类变量。

一般问题是子类比超类更具体,这就是为什么你不能将超类对象分配给子类变量,因为超类不知道子类需要知道的事情。

另一方面,子类知道超类的详细信息以及更多详细信息,这意味着您可以将子类对象分配给超类变量。

问题的解决方案:( 编辑)

通常,您扩展该类并能够重写迭代器方法并返回您想要的类型的构造良好的迭代器。

但我在这里看到的问题是工厂创建了 SamReader 类型的 obj,您可以使用它来迭代 SamRecords

SO -> 您必须扩展工厂以返回其他类型的 SamReader 并稍后迭代您想要的记录类型,请参阅

Factory类的源代码:

https://github.com/samtools/htsjdk/blob/master/src/java/htsjdk/samtools/SamReaderFactory.java