Input
とOutput
という2つのクラスがあり、それらが互いに接続されているとします。 Output
はあるタイプの値を生成し、Input
がそれらを消費します。この例ではスカラが型パラメータを推論できないのはなぜですか?
class Input[T] {
var output: Option[Output[_ <: T]] = None
}
class Output[T] {
var input: Option[Input[_ >: T]] = None
}
Input
とOutput
ペアは限りInput
型パラメータがOutput
型パラメータのスーパータイプであると値の同じ種類に動作しない場合、それは大丈夫です。両方のクラスの型パラメータは不変であることに注意してください。実際のバージョンでは、それは共位置および反位置の両方の位置で使用される。
val out = new Output[String]
val in = new Input[AnyRef]
connect(out, in)
:私は以下のように、このメソッドを呼び出した場合、私は型エラーを取得
def connect[T](output: Output[T], input: Input[_ >: T]) = {
output.input = Some(input)
input.output = Some(output)
}
:
は私がInput
/
Output
ペア間のリンクを設定し他の場所
connect
方法を持っていますエラーは次のとおりです。
test.scala:17: error: type mismatch;
found : Output[String]
required: Output[AnyRef]
connect(out, in)
^
これを解決するには、型パラメータを書いてください(この場合、私はconnect[String]
と書いていますが、コンパイラが私のためにこれを理解できるはずだと思います。タイプパラメータが自動的に推測されるように、どのようにしてconnect
メソッドを変更できますか?
編集:今のところ、私はconnect
Output
の方法を作ったので、それは自動的に型パラメータを取得します。これには、埋め込み表記out connect in
を使用できるという追加の利点もありますが、デザインはやや厄介です。
私はまだコンパイラがこの動作を示す理由に興味があります。私はそれが型パラメータを推論することができるはずだと思う。これは実際に指定どおりに動作していますか?
あなたは「同じ*種類の*値を操作しないでください」という意味でしたか? –
Scalaのメーリングリストに質問してみましたか? – GClaramunt