java - 使用扩展类代替基类

标签 java class extends type-mismatch

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)

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

编辑:有关我正在使用的类的更多详细信息。 sam 对象来自

SamReaderFactory sf = SamReaderFactory.makeDefault();
SamReader sam= sf.open(new File(insam));

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

最佳答案

问题是:

sam.iterator().next()

返回一个SAMRecord对象

这意味着

SAMRecordExt recext= sam.iterator().next();

将不起作用,因为父类(super class)不能分配给子类变量。

普遍的问题是子类比父类(super class)更具体 这就是为什么不能将父类(super class)对象分配给子类变量的原因,因为父类(super class)不知道子类需要知道的事情。

另一方面,子类知道父类(super class)的细节以及更多细节,这意味着您可以将子类对象分配给父类(super class)变量。

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

通常,您扩展该类并能够覆盖迭代器方法并返回一个您希望的类型的构造良好的迭代器。

但我在这里看到的问题是,工厂创建了您用于迭代 SamRecords 的 SamReader 类型的对象

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

工厂类的源代码:

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

关于java - 使用扩展类代替基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29937803/

相关文章:

java - 在 Oreo 上复制 SQLite 数据库

java - 这个用例可以在 ehcache 中解决吗?

class - 在 TypeScript 中如何强制继承的类实现一个方法

java - 在类(而不是 Activity )之间传递数据会导致空指针异常

kotlin - 密封类扩展了其他密封类

delphi - 在 Delphi pascal 中使用自己的方法扩展库类

java - Button.setClickable(false) 不工作

java - 使用 DiskLruCache 时出现正则表达式错误 (Jake Wharton)

javascript - 使用 JavaScript 与 SVG 元素交互

java - 如何在Java中的Lambda函数中调用父类中的方法?