2016-09-06 2 views
3

Ich stoße auf ein Problem mit Kotlins Typsystem. Ich erklärte die Variable, wie unten in Klassenbereich:Kotlin-Typ-Inferenz fehlgeschlagen - Typenkonflikt "Found Array <*?>, Erforderliches Array <*>?"

var planets: ArrayList<Planet>? = null 

und im Konstruktor Ich versuche, das Array zu initialisieren, aber ich einen Typenkonfliktfehler am Problem aufgetreten ist:

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

Fehler:

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

Warum erhalte ich diesen Fehler und wie behebe ich ihn?

Antwort

7

Mindestens einer der Planeten (earth, mars, saturn, jupiter, uranus, neptune, pluto) ist vom nullbaren Typ Planet?, daher ist der abgeleitete Typ arrayListOf(earth, ...)ArrayList<Planet?>.

Da ArrayList<Planet> nicht kontravariant auf Typ Planet ist, kann es nicht sicher mit Wert ArrayList<Planet?> zugewiesen werden.

Um das Problem zu lösen, können Sie:

  • alle Planeten von nicht Nullable Type stellen Sie sicher sind Planet
  • wenn die oben nicht möglich ist Veränderung

    var planets: ArrayList<Planet>? = null 
    

    zu

    var planets = arrayListOf<Planet?>() 
    
  • null Planeten herausfiltern und dann das Ergebnis Sammlungen planets zuordnen:

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

Ein anderer Weg, der Compiler glücklich zu machen ist es, die planetscontravariant wie so zu machen:

var planets: ArrayList<in Planet>? = null 

PS. Benutze kotlin collection typesList<T>, Set<T> und entsprechend listOf, setOf anstelle von Javas Pendants wann immer möglich.

+0

werden Sie irgendwie über neue #kotlin Fragen benachrichtigt? : P – mklimek

+1

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

+0

Wenn Sie wissen, welcher Planet nullfähig ist, aber Sie sind sicher, dass es nicht ist, können Sie einfach schreiben ' Planet !! ' –

1

Ihre Planeten in der Liste haben den Typ Planet?, nicht Planet. Bitte, schau es dir an.

zu beheben gibt es drei Möglichkeiten:
1. Ändern Planeten geben zu Planet.
2. Ändern Listendefinition zu

var planets: ArrayList<Planet?>? = null 

3. Karte Planeten existiert, wenn Sie sicher, dass sie

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

Nummer 2 das schlechteste ist, ziehe ich die Nummer 1, wenn es unmöglich ist, , Nummer 3 als Workaround.

Verwandte Themen