这是一个非常简单的scala示例,但无法编译:
abstract class Box[+A] {
var value: A = _
}
错误是:
covariant type A occurs in contravariant position in type A of parameter of setter value_=
我希望班级做的是:
class StringBox extends Box[String]
class DateBox extends Box[Date]
object Testbox {
def main(args: Array[String]) {
val list = ListBuffer[Box[Any]]()
val str = new StringBox
str.value = "abc"
val date = new DateBox
date.value = new Date
list += str
list += date
println(list)
}
}
答案 0 :(得分:4)
可变类(以及您的类Box
是可变的)在其可变字段的类型中不能是协变的。您可以通过
Box
不可变
abstract class Box[+A] { val value: A }
答案 1 :(得分:4)
它不能编译,因为它不正确。如果scala允许你这样做,那么你可能会违反类型安全。例如:
import scala.annotation.unchecked.uncheckedVariance
abstract class Box[+A] {
var value: A @uncheckedVariance = _
}
class StringBox extends Box[String]
val sb = new StringBox; sb.value = "abc"
val sa: Box[Any] = sb
sa.value = 5
println(sb.value.length)
答案 2 :(得分:2)
请看这个问题的答案: Scala covariance / contravariance question