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
,但它与 item
的 A
完全无关。
类型推断只有在有起点(通常是参数类型或预期的 return 类型)时才有效。
尝试
var myContainer = Container.setUpContainer[A]()
或
var myContainer: Container[A] = Container.setUpContainer()
我正在尝试让一些通用的 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
,但它与 item
的 A
完全无关。
类型推断只有在有起点(通常是参数类型或预期的 return 类型)时才有效。
尝试
var myContainer = Container.setUpContainer[A]()
或
var myContainer: Container[A] = Container.setUpContainer()