Как конвертировать массив?в массив <T>в Котлине - PullRequest
3 голосов
/ 03 апреля 2012

Я делаю свои первые шаги в Kotlin и пытаюсь написать простую функцию разделения строк. Я начал с этого:

fun splitCSV(s : String) : Array<String> {
    return s.split(",");
}

Который, я думаю, можно записать так:

fun splitCSV(s : String) : Array<String> = s.split(",");

Но я получаю ошибку типа, поскольку s.split возвращает Array<String?>?, а не Array<String>. Я не смог найти простой способ сделать приведение, поэтому я написал эту функцию для преобразования:

fun forceNotNull<T>(a : Array<T?>?) : Array<T> {
    return Array<T>(a!!.size, { i -> a!![i]!! });
}

fun splitCSV(s : String) : Array<String> = forceNotNull(s.split(","));

Однако теперь я получаю сообщение об ошибке во время выполнения:

ClassCastException: [Ljava.lang.Object; нельзя привести к [Ljava.lang.String

Если я поменяю T в forceNotNull на String, то это сработает, поэтому я думаю, что я близок к решению.

Это правильный путь? И если это так, как я могу исправить forceNotNull для работы в общем случае?

1 Ответ

1 голос
/ 03 апреля 2012

Не уверен, что это лучший метод, но, похоже, он работает:

fun splitCSV(s : String) : Array<String> {
  return ( s.split(",") as? Array<String>? ).sure() ;
}

Хотя IntelliJ выделяет as? с помощью "Это приведение никогда не может быть успешным" ... Так чтоМой первоначальный оптимизм угасает

Как ни странно, похоже, что он работает ...

Как и:

fun splitCSV(s : String) : Array<String> {
  return s.split(",").sure() as Array<String> ;
}

Но с тем же предупреждением ... Язапутавшись, поэтому я остановлюсь сейчас: - /

Edit

Конечно, вы можете заставить его работать с List<String>:

import java.util.List

fun splitCSV(s : String) : List<String> {
  return s.split(",")!!.map<String?,String> { it!! }
}

, но этоне вопрос; -)

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