【问题标题】:Use extended class in place of base class使用扩展类代替基类
【发布时间】:2015-04-29 08:06:34
【问题描述】:

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”的声明
  • 看来那个类是要和超类一起使用的,意思是:作者知道超类,需要它提供的功能。现在,问题是,当您尝试进行强制转换时:子类的每个实例都是超类的实例,但并非超类的每个实例都是子类的实例。
  • 在我看来,您没有运行您认为正在运行的代码,或者您没有编译您发布的代码。根据您发布的代码,您不应该收到任何提供 SAMRecordExt extends SAMRecord 的编译错误。

标签: java class extends type-mismatch


【解决方案1】:

问题是:

sam.iterator().next()

返回一个SAMRecord 对象

这意味着

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

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

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

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

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

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

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

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

Factory类的源码:

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

【讨论】:

  • HI- 当您说“对变量使用 SAMRecord 类型”时,这难道不会破坏扩展类的意义吗?
  • 谢谢!关于“覆盖子类中的迭代器方法”,您是否有机会发布要使用的代码概要?
  • 我看到的问题是工厂创建了 SamReder 类型的 obj,您可以使用它来迭代 SamRecords -> 您必须扩展工厂以返回其他类型的 SamReader 并稍后迭代其他记录类型,请参见github.com/samtools/htsjdk/blob/master/src/java/htsjdk/samtools/…
  • 谢谢,我会调查的。所以问题和解决方案是在 SamReader 中,而不是在我的 SAMRecordExt 中。
  • 正确,我之前没有意识到,因为我过度阅读了 sam 变量的声明:SamReader sam= sf.open(new File(insam));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多