scala - 协变类型T发生在相反位置

标签 scala

我知道之前曾有人问过这个问题,但答案不适用于这种情况,或者我听不懂。

基本上,下面的(重新创建我的问题的简单示例)为什么不起作用?

class Test[+T] {
    var list: List[T] = _
}


我遇到的问题是我有一个对象,我想在其中传递Test [Nothing](空Test)的实例,除非我在T中使Test成为协变量,否则这是行不通的。

最佳答案

T中使测试成为协变量意味着对于任何Test[A]Test[Any]A的子类型。因此,让我们创建一个Test

val test_string = new Test[String]


现在我们有了一个Test[String],并且所包含的listList[String]类型。

由于Test[String]Test[Any]的子类型,因此应允许以下内容:

val test_any : Test[Any] = test_string


现在,我们有了一个Test[Any],因此test_any.list的类型为List[Any],这意味着以下内容应有效:

test_any.list = List[Any]()


这意味着我们只是为test_strings列表成员分配了一个List[Any],这是不允许的,因为它应该是List[String],而不是List[Any]。这也意味着您可以在列表之前添加任何内容,因为它是List[Any]类型。

关于scala - 协变类型T发生在相反位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14584830/

相关文章:

scala - 检查 Play 当前模式会发生错误

java - IntelliJ Build 不执行 sbt 'compile' 依赖

scala - saveAsNewAPIHadoopFile() 在用作输出格式时出错

java - 如何将 Java 集合/列表转换为 Scala seq?

java - Play 2.x : Binding model which contains a list to the template

java - 什么是 Java 中的 monad 模拟?

scala - Spark Structured Streaming DataFrame 上的排序操作

java - 在单个项目中使用 SBT 和 Maven?

java - 在 SCALA 中使用动态值进行 Base64 JAVA 编码 - GATLING

scala - Scala REPL 打印的类型是什么?