Scala:返回子类型的Typed方法

时间:2013-02-20 06:20:24

标签: scala currying

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

我有一个抽象类

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文件。我这样做基本上是为了体验,它看起来像一个有趣的面向对象和功能设计问题。

要创建一个特定的盒子阅读器,我需要一个基本的盒子,它是标题信息和一个读取器对象,基本上可以读取特定的文件。我想编写一个给出一个框(具有框类型)的函数我得到一个部分应用的函数,它返回一个子类型的IsoBoxReader。这样调用者可以使用其IsoReader版本(文件读取,有状态对象)创建实际实例。编译器抱怨模式匹配,特别是调用类型不匹配。

它说发现了FileTypeBoxReader,但预期为T

但是,基于Type参数,FileTypeBoxReader不是有效的返回值,因为它是IsoBoxReader的子类型吗?

1 个答案:

答案 0 :(得分: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()的调用点处无法确定类型T 静态。因此,在此处使用类型参数T是不对的。