Почему в моем приложении появляется следующая ошибка
Caught TypeError while rendering: 'ModelNameHere' object is not iterable
, но я не
найдено: java.lang.String ("foo")
требуется: ничего
queue.add ("foo")
Насколько я понимаю, я не указал тип элементов, входящих в очередь. Если это так, как мы указываем типы в scala для LinkedBlockingQueue вместо стандартных по умолчанию?
Когда вы не указываете сигнатуру типа, но она необходима, Scala использует самую ограничительную сигнатуру из возможных. Поскольку Nothing
является самой ограничительной из всех (ничто не может быть Nothing
!), Scala выбирает LinkedBlockingQueue[Nothing]
.
Но в этом случае ограничительный характер означает, что вы не сможете ничего поместить в эту сильно ограничивающую очередь.
Как вы уже поняли, решением является указание типа классов в коллекции:
val queue = new LinkedBlockingQueue[String]
Но обратите внимание, что определитель типов может определить нужный тип и в других случаях, следуя правилу "как можно более ограниченный". Например, если initial
- это другая коллекция Java, которая типизирована как содержащая строки,
val queue = new LinkedBlockingQueue(initial)
это просто сработает, так как будет считан тип String
из initial
.
Для параллельного сбора вы можете использовать коллекции Google (Guava) , у которых есть фабрика GenericMapMaker .
Я угадала. Тип должен быть указан, как показано -
val queue=new LinkedBlockingQueue[String]
Необработанные типы Java - это уступка обратной совместимости, и их использование считается плохим стилем. В Scala у вас нет необработанных типов, поэтому вы должны либо указать их, либо логический вывод типов должен иметь возможность вывести их. Обратите внимание, что вы также можете указать параметрический тип с левой стороны:
val queue:LinkedBlockingQueue[String] = new LinkedBlockingQueue()
Это не имеет большого смысла, но важно, если вы хотите иметь другой тип (например, Queue [String]
для вашего переменная.