0

我正在尝试编写一个返回部分应用函数的函数,该函数返回特定抽象类的子类型。

我有一个抽象类

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 的子类型?

4

1 回答 1

1

试试这个:

def recognize( box ): (IsoReader) => IsoBoxReader =
{
    box.boxType match {
      case "ftyp" => ( isoReader: IsoReader ) => new FileTypeBoxReader( box, isoReader )
      case _ => // return some other box type
    }
}

def recognize[ T <: IsoBoxReader ]( box ): (IsoReader) => T应该适用于作为子类型的任何特定类型IsoBoxReader,这在这种情况下显然是不可能的。换句话说,由于实际类型是在运行时由 确定的,因此无法在类型box.boxType的调用点静态确定。所以在这里使用类型参数是不对的。recognize()TT

于 2013-02-20T06:38:48.327 回答