1
私は解決できないような型の不一致の原因となっているシナリオがあります。スカラ型の不一致エラー
abstract class Msg
trait Channel[M <: Msg] {
def receive(): M
def ack(envelope: M)
}
object ChannelSender {
private var channel : Channel[_ <: Msg] = _
def assignChannel(channel : Channel[_ <: Msg]) = this.channel = channel
def test() {
val msg = channel.receive()
channel.ack(msg) // Type mismatch here
}
}
コンパイラからのエラーは次のとおりです:ここでは、コードの簡易版です
私はこの作業を取得するために作ることができるの変更のどのような型の不一致。見つかった:(基になる型 com.msgtest.Envelope付き)msg.typeが必要:_ $ 1ここで、タイプ_ $ 1 <: com.msgtest.Envelope
?また、変更はその次具体的な実装のコンパイルが必要になります。
class SomeMsg extends Msg
object SomeChannel extends Channel[SomeMsg] {
def receive(): SomeMsg = { null.asInstanceOf[SomeMsg] }
def ack(envelope: SomeMsg) {}
}
object Setup {
ChannelSender.assignChannel(SomeChannel)
}
良いこと、ありがとう!私はなぜこれらの変更のいずれかが必要だった理由は分かりません。 Channel.Mが外部から見えない場合は、それは何ですか?特性/クラスの外で使用できるように型パラメータの型エイリアスを作成する必要がありますか? ChannelSenderを変更すると、同じ 'channel'オブジェクトで' receive() 'と' ack'を呼び出すので、パス依存型c.M2は同じことを意味しませんか? – Josh
素晴らしい質問。最初のものについては、私は答えを知らない。たぶん、メーリングリストの知識が豊富な人が役に立つかもしれません。 2つ目は、この場合、 'channel'オブジェクトが変更されていないことをScalaが知ることができたことに同意しますが、一般的には、' var'が同じままであることを仮定していると仮定します。 –