Scala 泛型打破了对 var 的重新分配

Scala generics break reassignment to var

我正在尝试让一些通用的 classes 工作,但我无法编译它们。我有一个通用容器 class,我想在其中存储一个项目,我有另一个通用容器 class,它在容器 class:

中存储一个项目
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 的 return 值分配给变量 myContainer,如下所示:

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

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

此外,如果我不使用泛型而是使用字符串,它也不会抱怨。

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
  }
}

有谁知道可能导致此行为的原因以及如何修复它,所以我可以像使用字符串 classes 一样使用通用 classes(即首先在一个变量,然后用带有实际项目的容器覆盖变量)?提前谢谢你。

var myContainer = Container.setUpContainer()

这个类型不是Container[A]

setUpContainer returns a Container[X] for any X you choose (you have confusingly named X as A in the method definition setUpContainer,但它与 itemA 完全无关。

类型推断只有在有起点(通常是参数类型或预期的 return 类型)时才有效。

尝试

  var myContainer = Container.setUpContainer[A]()

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