0
Scalaコンパイラ(バージョン2.11.7)がオブジェクト(別名型メンバー)で定義された型に関する型情報をどのように渡すのか疑問に思っています。入れ子型の型情報を保持する
(new Bar).myCall
それが正常に動作し、私は20
が返された値を取得する:私はこのようなコールを持っている場合、
trait Foo {
type Contents <: Any
val value: Contents
// Just a mock function call that uses a manifest.
def myCall(implicit mf: Manifest[Contents]): Contents = value
}
class Bar extends Foo {
type Contents = Int
val value = 20
}
class Baz extends Foo {
type Contents = String
val value = "it's baz"
}
:
は、これらのクラスを考えてみましょう。同様に、このような呼び出しを行うことも動作します。この場合
List(new Bar, new Bar).head.myCall
を、私はまだ20
が返されます。私はFoo
のリストからコールを行う場合は、このような何か:
List(new Bar, new Baz).head.myCall
は、私は、コールのために利用可能なマニフェストがないと言って、コンパイラのエラーを得ました。私の質問は、Manifest(またはTypeTag〜実際には関係ない)をどこかに渡すことが可能かどうかです。もしそうなら、どうですか?それはBar
とBaz
最安の一般的なタイプですので、あなたの第2のケースで
ありがとうございます。しかしこれには事前に「バー」と「バズ」を知っておく必要があります。 'Foo'がどのように拡張されるのか分からなければ、動作させる方法はありますか? – bow
あなたが知っているように、「Fooを拡張しているT」のマッチングはうまくいきません。構造型(別名:ダックタイピングとも呼ばれます)と呼ばれる別の可能性があります。これは、「パターンに一致するメソッドmyCallを持つ型」です。しかし、私はあなたがそのように適切なマニフェストを注入できるとは思わないが、私は間違っているかもしれない(構造型は私が多くの経験を持っていないタイプのアクロバットである)。 http://stackoverflow.com/questions/1988181/pattern-matching-structural-types-in-scalaを参照してください。 – slouc