泛型类型如何在Scala中与继承一起使用?

Mirceac21:

我试图了解泛型如何在Scala中与继承一起工作。我有以下代码:

sealed trait Model {}
case class Model1() extends Model
case class Model2() extends Model

trait Repo[A <: Model] {
  def doSomething(model: A)
}
class Repo1 extends Repo[Model1] {
  override def doSomething(model: Model1): Unit = {
    println("Model 1")
  }
}
class Repo2 extends Repo[Model2] {
  override def doSomething(model: Model2): Unit = {
    println("Model 2")
  }
}

object Play extends App {
  def getModel(i: Int): Model =
    i match {
      case 1 => Model1()
      case 2 => Model2()
      case _ => throw new RuntimeException("model not found")
    }
  val model = getModel(1)
  val repo = model match {
    case _: Model1 => new Repo1
    case _: Model2 => new Repo2
    case _         => throw new RuntimeException("something went wrong")
  }
  repo.doSomething(model)
}

在最后一行repo.doSomething(model)我得到Type mismatch. Required: _.$1 Found: Model

根据此答案,在Scala中使用泛型实现特征的正确方法是什么?如果我的repos类使用该类型扩展了特征应该起作用。

我是Scala的新手,正在尝试围绕类型系统,泛型,隐式,上限/下限...

什么是_.$1类型,我该如何做?谢谢!

马丁(Martijn):

scala是静态类型的,其值model是编译时间类型Modelrepo编译时间类型的Repo

因此repo.doSomething没有进一步完善。的签名doSomething说它将接受Model参数的某些子类型,但我们不知道是哪个子类型,换句话说,编译器不知道的类型modelrepoalign 的类型

为了使它们对齐,您有几种选择。

  1. 因为您知道类型对齐,是因为您以一种比编译器更了解的方式构造了类型,所以请告诉编译器,
val castRepo = repo.asInstanceOf[Repo[Any]]

这样就关闭了安全性,您告诉scala“相信我,我知道我在做什么”。当您知道自己在做什么时,这在某种程度上是可以的,但是真正知道自己在做什么的人往往不相信自己比编译器更了解自己,因此保留类型安全性的另一种解决方案可能会更好。

  1. 重组程序,使事情对齐。

例如,您可以创建包装类型

case class Aligned[A <: Model](model: A, repo: Repo[A]) {
  def doIt = repo.doSomething(model)
}
val aligned = model match {
  case m: Model1 => Aligned(m, new Repo1)
  case m: Model2 => Aligned(m, new Repo2)
  case _         => throw new RuntimeException("something went wrong")
}

aligned.doIt

Aligned,scalac知道Model类型和Repo类型排列。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

JDK 8的类型推断如何与泛型一起工作?

泛型类型推断不能与方法链接一起使用?

如何在Kotlin中将TypeToken +泛型与Gson一起使用

类型推断如何与重载泛型方法一起工作

Scala中的泛型继承

如何在不声明泛型类型的情况下将类与泛型一起使用

如何在带有React的Typescript / JSX中将泛型与箭头功能一起使用?

TypeScript:将映射类型与泛型一起使用

如何在Scala中将依赖于路径的类型与类型类一起使用

C#泛型类:如何限制成员函数与特定类型一起使用?

如何将DataContractJsonSerializer与泛型一起使用

非泛型类型不能与类型参数一起使用(Realm Xamarin)

将相关类型结合在一起,以使用泛型控制代码中的使用

如何在Kotlin中将vararg与不同的泛型一起使用?

如何在Kotlin中没有泛型接口的情况下继承实现中的泛型类型?

在将泛型引用类型与泛型类型一起使用时收到警告

如何在React.memo中将Props与泛型一起使用

非泛型方法'HttpClient.GetAsync(string)'不能与类型参数一起使用

将联合类型与泛型一起使用

如何在Rust中将内部可变性与泛型一起使用?

如何在EF6代码优先中将泛型类型与数据库上下文一起使用

Scala如何在foreach中还原泛型类型

泛型和继承:将泛型与基类及其子类一起使用

如何将Swift协议与泛型方法和泛型类型一起使用

非泛型类型'DelegateCommand'不能与类型参数一起使用

非泛型类型字段不能与类型参数一起使用

对泛型如何与继承一起工作感到困惑

Java:如何将 Arrays.copyOfRange() 与泛型类型一起使用?

如何在自类型中自动继承mixin泛型类型?