首页 > 解决方案 > Scala 泛型中断对 var 的重新分配

问题描述

我试图让一些通用类工作,但我无法让它们编译。我有一个通用 Container 类,我想在其中存储一个项目,我有另一个通用类,它将一个项目存储在 Container 类中:

final case class Container[A](var item: A) 

object Container {
  def FillContainer[A](item: A): Container[A] = {
    Container(item)
  }

  def setUpContainer[A]() = FillContainer[A](null.asInstanceOf[A])
}
class MyGenericClass[A] {
  def fill(item: A) {
    var myContainer = Container.setUpContainer()
    myContainer = Container.FillContainer(item) //type mismatch; found : A required: Null
  }
}

(我知道在 Scala 中使用 null 是不好的做法,但遗憾的是我没有太多选择。)

首先,容器 myContainer 应该通过 setUpContainer 命令使用一些默认值(在本例中为 null)进行初始化。之后,我想要同一个变量 myContainer 来保存另一个带有实际项目的容器。但是我在 MyGenericClass 的 FillContainer 命令中收到了一个错误: type mismatch; found : A required: Null我不太明白为什么。如果我立即将 FillContainer 的返回值分配给变量 myContainer,如下所示:

def fill(item: A) {
  var myContainer = Container.FillContainer(item)
}

它工作得很好。立即分配值和稍后重新分配值有什么区别?

此外,如果我不使用泛型并使用 String ,它也不会抱怨。

final case class StringContainer(var item: String) 

object StringContainer {
  def FillContainer(item: String): StringContainer = {
    StringContainer(item)
  }

  def setUpContainer() = FillContainer(null)
}


class StringClass {
  def fill(item: String) {
    var myContainer = StringContainer.setUpContainer()
    myContainer = StringContainer.FillContainer(item) //no problem
  }
}

有谁知道什么可能导致这种行为以及如何解决它,所以我可以使用与字符串类相同的泛型类(即首先在变量中初始化容器,然后用带有实际项目的容器覆盖变量)?先感谢您。

标签: scalagenericsvar

解决方案


var myContainer = Container.setUpContainer()

this 的类型不是Container[A]

setUpContainer为您选择Container[X]的任何返回 a (您在 的方法定义中混淆地命名为,但它与您的 完全无关)。XXAsetUpContainerAitem

类型推断只有在有起点(通常是参数类型或预期的返回类型)的情况下才能工作。

尝试

  var myContainer = Container.setUpContainer[A]()

或者

  var myContainer: Container[A] = Container.setUpContainer()

推荐阅读