2015-10-08 19 views
19

Sto cercando di creare una classe parametrizzata con una proprietà lateinit non annullabile del tipo generico:Perché una proprietà tipizzata generica non è valida?

class Test<T> { 

    private lateinit var t : T 

    private lateinit var s : String 

} 

Quest'ultimo è consentito, ma la prima non è. Il compilatore restituisce il seguente errore:

Error:(7, 11) ''lateinit'' modifier is not allowed on nullable properties 

Dal momento che non ha dichiarato T?, sono confuso sul motivo per cui questo è il caso.

+0

Maledizione, mi stava per inviare e rispondere a questa domanda io stesso. Non l'ho trovato con una semplice ricerca; Suggerirei di includere "lateinit" nel titolo della domanda, dal momento che questo è l'innesco per il tuo problema in primo luogo. –

risposta

32

"Il valore predefinito limite superiore (se non specificato) è Any?" (http://kotlinlang.org/docs/reference/generics.html#generic-constraints)

In altre parole, quando si utilizza T, Kotlin presuppone che questo potrebbe essere qualsiasi tipo, sia esso primitivo, oggetto o un riferimento nullable.

TL; DR;

per fissare aggiungere un tipo superiore:

class Test<T: Any> { ... } 
+0

e BTW, la sintassi 'T?' Non è consentita, quindi tecnicamente NON c'è incoerenza. – voddan

+2

'T?' È permesso nell'uso di 'T', non la dichiarazione di' T'. Quindi 'val x: T?' È valido. –

+0

Puoi leggere di più su T? qui https://medium.com/@igorwojda/kotlin-deep-dive-into-generics-nullability-9853d9a9f50d –

Problemi correlati