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()