2015-10-08 13 views
19

Próbuję utworzyć klasę parametryczne z lateinit non wartości pustych nieruchomości typu rodzajowego:Dlaczego ogólna właściwość typowana jest zerowa?

class Test<T> { 

    private lateinit var t : T 

    private lateinit var s : String 

} 

Ten ostatni jest dozwolone, ale były nie jest. Kompilator zwraca następujący błąd:

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

Ponieważ nie deklarują T?, jestem zdezorientowany, dlaczego tak jest.

+0

cera to, miałem zamiar pisać i odpowiadać na to pytanie sam. Nie znalazłem tego za pomocą prostego wyszukiwania; Proponuję, aby w tytule pytania znalazło się słowo "lateinit", ponieważ w pierwszej kolejności jest to przyczyną problemu. –

Odpowiedz

32

„Domyślna górną granicę (jeśli nie podano) jest Any?” (http://kotlinlang.org/docs/reference/generics.html#generic-constraints)

Innymi słowy, gdy używasz T, Kotlin zakłada, że ​​może to być dowolny typu, czy to prymitywne, obiektu lub odniesienie zerowe.

TL; DR;

naprawić dodać typ górna:

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

i BTW, składnia 'T?' Jest niedozwolona, ​​więc technicznie NIE ma niezgodności. – voddan

+2

'T?' Jest dozwolone przy użyciu 'T', a nie deklaracji' T'. Więc "val x: T?" Jest prawidłowe. –

+0

Możesz przeczytać więcej na T? tutaj https://medium.com/@igorwojda/kotlin-deep-dive-into-generics-nullability-9853d9a9f50d –

Powiązane problemy