2016-09-06 4 views
3

У меня возникла проблема с системой типа Котлина. Я объявил переменную, как показано ниже в области видимости класса:Ошибка вывода типа Kotlin - несоответствие типа "Найдено Array <*?>, Требуемый массив <*>?"

var planets: ArrayList<Planet>? = null 

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

planets = arrayListOf(earth, mars, saturn, jupiter, uranus, neptune, pluto) 

ошибка:

Required: ArrayList<Planet>? 
Found: ArrayList<Planet?> 

Почему я получаю эту ошибку и как ее исправить?

ответ

7

По меньшей мере одна из планет (earth, mars, saturn, jupiter, uranus, neptune, pluto) имеет тип NULL Planet?. Следовательно, выведенный тип arrayListOf(earth, ...) - ArrayList<Planet?>.

С ArrayList<Planet> не является контравариантным по типу Planet. Нельзя смело присвоить значение ArrayList<Planet?>.

Чтобы решить эту проблему, вы можете:

  • убедитесь, что все планеты имеют не обнуляемого типа Planet
  • если выше не представляется возможным изменение

    var planets: ArrayList<Planet>? = null 
    

    в

    var planets = arrayListOf<Planet?>() 
    
  • отфильтровывать null планет, а затем присвоить коллекции результирующих planets:

    planets = arrayListOf(*arrayListOf(earth, ...).filterNotNull().toTypedArray()) 
    

Другой способ сделать компилятор счастливым сделать planetscontravariant как так:

var planets: ArrayList<in Planet>? = null 

PS. Используйте kotlin collection typesList<T>, Set<T> и соответствующие listOf, setOf вместо аналогов Java, когда это возможно.

+0

Вы как-то узнали о новых вопросах #kotlin? : P – mklimek

+1

@mklimek http://meta.stackoverflow.com/questions/254318/how-to-subscribe-to-tags – miensol

+0

Если вы знаете, какая планета является нулевой, но вы уверены, что это не так, вы можете просто написать ' планета !! ' –

1

Ваши планеты в списке имеют тип Planet?, не Planet. Пожалуйста, проверьте это.

Исправить можно тремя способами:
1. Измените тип планет на Planet.
2. Изменить список определений для

var planets: ArrayList<Planet?>? = null 

3. Карта существовали планеты, если вы уверены, что они не равны нулю

planets = ArrayList(listOf(earth, ...).map { it!! }) 
// or safer way 
planets = ArrayList(listOf(earth, ...).filterNotNull()) 

Номер 2 является наихудшим один, я предпочитаю номер 1, если это невозможно , номер 3 в качестве обходного пути.

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