Я пытаюсь преобразовать async communication java sample code из Lettuce (один из клиентов Redis) в scala, но сталкивается с ошибкой компиляции, поскольку тип выражения аргумента несовместим.scala аргумент тип несовместимая ошибка при вызове java.util.ArrayList.toArray метод
Вот мой код
def RunAsync() = {
val redisClient = new RedisClient(RedisURI.create(connURL))
val connection = redisClient.connectAsync()
connection.setAutoFlushCommands(false)
val futures = Lists.newArrayList[RedisFuture[_]]()
for(lc <- Range(0, logCount))
{
futures.add(connection.set(logContents(lc).key, logContents(lc).value))
}
connection.flushCommands()
val convFutures = futures.toArray(new Array[RedisFuture[_]](futures.size()))
val result = LettuceFutures.awaitAll(10L, TimeUnit.SECONDS, convFutures : _*)
connection.close()
redisClient.shutdown()
}
А вот сообщение об ошибке я получил во время компиляции
Error:(67, 31) no type parameters for method toArray: (x$1: Array[T with Object])Array[T with Object] exist so that it can be applied to arguments (Array[com.lambdaworks.redis.RedisFuture[_]])
--- because ---
argument expression's type is not compatible with formal parameter type;
found : Array[com.lambdaworks.redis.RedisFuture[_]]
required: Array[?T with Object]
Note: com.lambdaworks.redis.RedisFuture[_] >: ?T with Object, but class Array is invariant in type T.
You may wish to investigate a wildcard type such as `_ >: ?T with Object`. (SLS 3.2.10)
val convFutures = futures.toArray(new Array[RedisFuture[_]](futures.size()))
^
После нескольких часов Googling, я мог бы найти некоторые ссылки, которые помогут понять мою ситуацию, но не найти решение для этого. Кто-нибудь, пожалуйста, назовет меня лучшим способом решить эту проблему?
Спасибо @Dima! Я попытался с вашей рекомендацией и сделал это с небольшой модификацией: val convFuturesPart = Range (0, logCount) .map {lc => connection.set (logContents (lc) .key, logContents (lc) .value) .asInstanceOf [ java.util.concurrent.Future [_]] } .toArray –