我正在尝试编写一个返回部分应用函数的函数,该函数返回特定抽象类的子类型。
我有一个抽象类
abstract class IsoBoxReader
我有一个派生类
class FileTypeBoxReader( val box, val isoReader ) extends IsoBoxReader
我想做这样的事情,但我不确定它是否可能:
def recognize[ T <: IsoBoxReader ]( box ): (IsoReader) => T =
{
box.boxType match {
case "ftyp" => ( isoReader: IsoReader ) => new FileTypeBoxReader( box, isoReader )
case _ => // return some other box type
}
}
上述基于一条信息的方法返回一个部分应用的函数,该函数可以在以后剩余必要参数可用的地方使用。
你们中的一些人可能已经猜到我正在尝试根据 ISO 规范解析媒体 Iso 文件。我这样做基本上是为了体验,这似乎是一个有趣的 OO 和功能设计问题。
要创建一个特定的盒子阅读器,我需要一个基本盒子,它是标题信息和一个阅读器对象,它基本上可以读取特定的文件。我想编写一个给定盒子的函数(它具有盒子类型),我得到一个部分应用的函数,它返回 IsoBoxReader 的子类型。这样,调用者可以使用其 IsoReader 版本(文件读取,有状态对象)创建实际实例。编译器抱怨模式匹配,特别是调用类型不匹配。
它说找到 FileTypeBoxReader 但预期 T
但是,基于 Type 参数, FileTypeBoxReader 是不是一个有效的返回值,因为它是 IsoBoxReader 的子类型?