Scala泛型中断重新分配到var

Scala泛型中断重新分配到var,scala,generics,var,Scala,Generics,Var,我试图让一些泛型类工作,但我无法使它们编译。我有一个通用容器类,我想在其中存储一个项目,还有一个通用类,它在容器类中存储一个项目: final case class Container[A](var item: A) object Container { def FillContainer[A](item: A): Container[A] = { Container(item) } def setUpContainer[A]() = FillContainer[A](

我试图让一些泛型类工作,但我无法使它们编译。我有一个通用容器类,我想在其中存储一个项目,还有一个通用类,它在容器类中存储一个项目:

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])
}
(我知道在Scala中使用null是不好的做法,但遗憾的是,在这里我没有太多选择。)

首先,应该通过setUpContainer命令使用一些默认值(在本例中为null)初始化容器myContainer。之后,我希望相同的变量myContainer容纳另一个包含实际项目的容器。但是我在MyGenericClass中的FillContainer命令中得到一个错误:
类型不匹配;找到:A required:Null
,我不太明白为什么。如果我立即将FillContainer的返回值指定给变量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
  }
}
是否有人知道是什么导致了这种行为以及如何修复它,这样我就可以像使用字符串类一样使用泛型类(即,首先在变量中初始化容器,然后用实际项的容器覆盖变量)?先谢谢你

var myContainer = Container.setUpContainer()
此类型不是
容器[A]

setUpContainer
为您选择的任何
X
返回一个
Container[X]
(您在
setUpContainer
的方法定义中将
X
命名为
a
,但它与
项的
a
完全无关)

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

试一试

此类型不是
容器[A]

setUpContainer
为您选择的任何
X
返回一个
Container[X]
(您在
setUpContainer
的方法定义中将
X
命名为
a
,但它与
项的
a
完全无关)

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

试一试


不仅
null
而且可变性也是一种不好的做法,特别是可变案例类是一种非常不好的做法,至少让它成为一个普通的类。最后,您基本上重新发明了一个不安全的选项。不仅
null
,而且可变性也是一种不好的做法,特别是可变案例类是一种非常不好的做法,至少让它成为一个普通类。最后,你基本上重新发明了一个不安全的选项。
var myContainer = Container.setUpContainer()
  var myContainer = Container.setUpContainer[A]()
  var myContainer: Container[A] = Container.setUpContainer()