【问题标题】:Scala: Typed Method that returns a subTypeScala:返回子类型的类型化方法
【发布时间】:2013-02-20 14:48:15
【问题描述】:

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

我有一个抽象类

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

【问题讨论】:

  • boxType 是在哪里定义的?它的定义是什么?请至少创建独立的代码片段。
  • boxType 是一个字符串...它只是一个选择器...

标签: scala currying


【解决方案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 &lt;: IsoBoxReader ]( box ): (IsoReader) =&gt; T 应该适用于作为IsoBoxReader 子类型的任何特定类型,这在这种情况下显然是不可能的。 换句话说,由于实际类型在运行时由box.boxType 确定,因此在recognize() 的调用点,T 类型不能静态地 确定。所以在这里使用类型参数T是不对的。

【讨论】:

  • 您的[IsoBoxReader] 不正确,应从签名中删除。
  • 那是我的错误。谢谢。
  • 谢谢...看来我最好回去了解有关类型化方法的更多信息...您所说的现在对我来说很有意义...
猜你喜欢
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 2013-01-02
  • 1970-01-01
相关资源
最近更新 更多