gpt4 book ai didi

java - 使用扩展类代替基类

转载 作者:搜寻专家 更新时间:2023-10-31 20:19:11 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com