Scala 不变类型的混合-类型不匹配发现了其他一些
在下面的代码中,我在下面的“问题”行中得到了上面的错误。我的问题是,是否有可能为z声明一个变量,这样它就可以被赋值为x或y。我的工作是使用我并不真正想要的ConsumeProduct方法。谢谢你的意见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
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,是的,我尝试过协方差,但在我最初的方法中,它在其他地方(呼叫站点)引发了问题,