Почему этот простой пример не может быть скомпилирован? - PullRequest
1 голос
/ 18 марта 2011

Это очень простой пример 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)
    }
}

Ответы [ 3 ]

4 голосов
/ 18 марта 2011

Не компилируется, потому что неверно.Если бы 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)
4 голосов
/ 18 марта 2011

изменяемые классы (а ваш класс Box изменчивый) не могут быть ковариантными по типу изменяемого поля.Вы можете сделать Box неизменным, хотя

abstract class Box[+A] { val value: A }
2 голосов
/ 18 марта 2011

Пожалуйста, посмотрите ответ на этот вопрос: Вопрос о ковариации / контравариантности Скалы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...