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
    }
}

1 つの情報に基づく上記のメソッドは、部分的に適用された関数を返します。この関数は、残りの必要な引数が利用可能な後で使用できます。

ISO 仕様に基づいてメディア Iso ファイルを解析しようとしていると推測した人もいるかもしれません。私は基本的に経験のためにこれを行っていますが、興味深いオブジェクト指向と機能設計の問題のようです。

特定のボックスリーダーを作成するには、ヘッダー情報である基本的なボックスと、基本的に特定のファイルの読み取りを行うリーダーオブジェクトが必要です。ボックス ( box タイプを持つ) を指定する関数を書きたいと思います。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 に答える