Scala 不变类型的混合-类型不匹配发现了其他一些

Scala 不变类型的混合-类型不匹配发现了其他一些,scala,Scala,在下面的代码中,我在下面的“问题”行中得到了上面的错误。我的问题是,是否有可能为z声明一个变量,这样它就可以被赋值为x或y。我的工作是使用我并不真正想要的ConsumeProduct方法。谢谢你的意见 package org.rest.rest trait Common case class A() extends Common case class B() extends Common trait Producer[T <: Common] { def produce(name

在下面的代码中,我在下面的“问题”行中得到了上面的错误。我的问题是,是否有可能为z声明一个变量,这样它就可以被赋值为x或y。我的工作是使用我并不真正想要的ConsumeProduct方法。谢谢你的意见

package org.rest.rest

trait Common

case class A() extends Common
case class B() extends Common

trait Producer[T <: Common] {
  def produce(name: String): T = ???
}

trait Consumer[T <: Common] {
  def consume(t: T): Unit = { }
}

class ProducerConsumer[T <: Common] extends Producer[T] with Consumer[T]    {
 // don't really want this method
  def consumeProduce(name: String): Unit =
    consume(produce(name))
}

object DemoMI {

  val x = new ProducerConsumer[A]
  x.consume(x.produce("abc"))
  val y = new ProducerConsumer[B]
  y.consume(y.produce("abc"))
  val z: ProducerConsumer[_] = x // what type declaration for z is possible here?
  z.consume(z.produce("abc")) // problem
  z.consumeProduce("abc") // works

}
package org.rest.rest
共同特征
case类A()扩展了公共
case类B()扩展了公共

trait Producer[T问题是Scala编译程序不知道
z.consume
获取
z.Producer
生成的内容

您可以使用抽象类型成员来解决此问题:

trait Producer {
  type T <: Common
  def produce(name: String): T = ???
}

trait Consumer {
  type T <: Common
  def consume(t: T): Unit = { }
}

trait ProducerConsumer extends Producer with Consumer

object DemoMI {
  val x = new ProducerConsumer {
    type T = A
    // definitions of consume and produce
  }

  val z: ProducerConsumer = x

  z.consume(z.produce("abc"))
}
trait生产者{

类型T是的,@gzm0有解决方案。我确实尝试了抽象类型成员,但无法使它们的行为与参数化特征不同。我现在能够添加的进一步改进是将这些效果组合起来,从而:

  trait ProducerConsumer extends Producer with Consumer 

  abstract class AbstractProducerConsumer[TT <: Common] extends ProducerConsumer {
    type T = TT
  }

  val x = new AbstractProducerConsumer[A] {}
  x.consume(x.produce("abc"))
  val y = new AbstractProducerConsumer[B] {}
  y.consume(y.produce("abc"))
  val z1: ProducerConsumer = x
  z1.consume(z1.produce("abc"))
  val z2: ProducerConsumer = y
  z2.consume(z2.produce("abc"))
trait ProducerConsumer用消费者扩展生产者

抽象类AbstractProducerConsumer[TT你得到了什么错误?你有没有尝试过使用协方差和逆变?@pedrofurla,错误在问题标题中。@Ben Reich,是的,我尝试过协方差,但在我最初的方法中,它在其他地方(呼叫站点)引发了问题,