Почему я получаю объект не повторяемая ошибка?

Почему в моем приложении появляется следующая ошибка

Caught TypeError while rendering: 'ModelNameHere' object is not iterable

, но я не найдено: java.lang.String ("foo")
требуется: ничего
queue.add ("foo")

Насколько я понимаю, я не указал тип элементов, входящих в очередь. Если это так, как мы указываем типы в scala для LinkedBlockingQueue вместо стандартных по умолчанию?

7
задан Esko 7 August 2010 в 15:51
поделиться

4 ответа

Когда вы не указываете сигнатуру типа, но она необходима, Scala использует самую ограничительную сигнатуру из возможных. Поскольку Nothing является самой ограничительной из всех (ничто не может быть Nothing!), Scala выбирает LinkedBlockingQueue[Nothing].

Но в этом случае ограничительный характер означает, что вы не сможете ничего поместить в эту сильно ограничивающую очередь.

Как вы уже поняли, решением является указание типа классов в коллекции:

val queue = new LinkedBlockingQueue[String]

Но обратите внимание, что определитель типов может определить нужный тип и в других случаях, следуя правилу "как можно более ограниченный". Например, если initial - это другая коллекция Java, которая типизирована как содержащая строки,

val queue = new LinkedBlockingQueue(initial)

это просто сработает, так как будет считан тип String из initial.

3
ответ дан 7 December 2019 в 07:38
поделиться

Для параллельного сбора вы можете использовать коллекции Google (Guava) , у которых есть фабрика GenericMapMaker .

Примеры Scala здесь и здесь

2
ответ дан 7 December 2019 в 07:38
поделиться

Я угадала. Тип должен быть указан, как показано -

val queue=new LinkedBlockingQueue[String]
1
ответ дан 7 December 2019 в 07:38
поделиться

Необработанные типы Java - это уступка обратной совместимости, и их использование считается плохим стилем. В Scala у вас нет необработанных типов, поэтому вы должны либо указать их, либо логический вывод типов должен иметь возможность вывести их. Обратите внимание, что вы также можете указать параметрический тип с левой стороны:

val queue:LinkedBlockingQueue[String] = new LinkedBlockingQueue()

Это не имеет большого смысла, но важно, если вы хотите иметь другой тип (например, Queue [String] для вашего переменная.

1
ответ дан 7 December 2019 в 07:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: