Scala: проблема несоответствия типов с типом Any и шаблонным классом - PullRequest
1 голос
/ 31 марта 2011

У меня есть следующая проблема с системой типов scala, и я в настоящее время не знаю, как это исправить.

В основном существует следующая ситуация:

У меня есть класс, давайте вызовемэто актер.Этот класс является шаблонным.

class Actor[T](){
    def setValue(value: T): Int = {
        //do something with value
    }
}

В другом классе есть метод, который выполняет итерацию по HashMap следующего типа:

var newValues = new HashMap[String, Any]()

Этот HashMap будет содержать значения типа Int и String.Ключ HashMap идентифицирует конкретный класс Actor и гарантирует, что тип значения соответствует шаблонному классу Actor, к которому он относится.

Метод другого класса выполняет итерацию по этому HashMap:

newValues.foreach(
    kv => {
        db.getActor(kv._1).setValue(kv._2) //db.getActor returns an Actor identified by kv._1
    }
)

Поскольку конкретное значение (kv._2) имеет тот же тип данных, что и шаблонный класс, полученный во время выполнения, я думал, что механизм scala сможет привести любой тип к конкретному подтипу T.

Но я получаю следующую ошибку во время компиляции:

found   : kv._2.type (with underlying type Any)
required: _$3 where type _$3
   db.getActor(kv._1).setValue(kv._2)

Кто-нибудь знает, как решить эту проблему?Я подумал, используя супер-тип Any, можно было бы обойти коммутатор и использовать asInstanceOf [T] объекта Any.

Надеюсь, кто-нибудь может мне помочь!

1 Ответ

2 голосов
/ 31 марта 2011

Проблема здесь:

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

Говорит кто?

Компилятор не смог доказать во время компиляции, что это действительно так. И, в принципе, он тебе не доверяет.

Вы всегда можете использовать asIntanceOf, чтобы сообщить компилятору, что вы знаете лучше - также известный как нацеливание оружия на вашу ногу. И мне интересно, какой тип db.getActor возвращается! Я почти догадываюсь о существовании.

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