scala - 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
}
}
有谁知道什么可能导致这种行为以及如何解决它,所以我可以使用与字符串类相同的泛型类(即首先在变量中初始化容器,然后用带有实际项目的容器覆盖变量)?先感谢您。
解决方案
var myContainer = Container.setUpContainer()
this 的类型不是Container[A]
。
setUpContainer
为您选择Container[X]
的任何返回 a (您在 的方法定义中混淆地命名为,但它与您的 完全无关)。X
X
A
setUpContainer
A
item
类型推断只有在有起点(通常是参数类型或预期的返回类型)的情况下才能工作。
尝试
var myContainer = Container.setUpContainer[A]()
或者
var myContainer: Container[A] = Container.setUpContainer()
推荐阅读
- asp.net - 如何使用多个 API 将 swagger 设置为项目?
- javascript - 如何一个接一个地调用两个异步函数?
- python - 硒用python打开后无法获取页面
- java - 为什么不建议在循环中更改字符串?推荐使用什么?
- python - 不确定 Shell 命令的类型
- javascript - 如何在子组件中调用反应上下文更新功能?
- php - 将用 C 编写的给定 CRC 16 代码转换为 PHP
- excel - 用于检索网站数据的 vba 代码不适用于 tls1.3。我能做些什么?
- javascript - 数组文字符号 [] 是可取的
- streaming - 使兄弟节点在流模式下具有父节点