2015-12-29 1 views
2

Я пытаюсь преобразовать 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, я мог бы найти некоторые ссылки, которые помогут понять мою ситуацию, но не найти решение для этого. Кто-нибудь, пожалуйста, назовет меня лучшим способом решить эту проблему?

ответ

1

Почему вы используете списки java? Попробуйте это:

val convFutures = Range(0, logCount).map { lc => 
    connection.set(logContents(lc).key, logContents(ls).value)) 
}.toArray 

Какой тип logContents кстати? Мог бы сделать это еще проще ...

Кроме того, это не похоже на то, что вам нужно .toArray здесь вообще. Varargs param в scala - Seq, а не Array.

+0

Спасибо @Dima! Я попытался с вашей рекомендацией и сделал это с небольшой модификацией: val convFuturesPart = Range (0, logCount) .map {lc => connection.set (logContents (lc) .key, logContents (lc) .value) .asInstanceOf [ java.util.concurrent.Future [_]] } .toArray –

Смежные вопросы