2015-10-08 5 views
19

Ben jenerik türde bir lateinit olmayan null özelliğe sahip bir parametreli sınıf oluşturmak çalışıyorum. Ben T? beyan etmedi yanaGenel yazılan bir özellik null neden olabilir?</p> <pre><code>class Test<T> { private lateinit var t : T private lateinit var s : String } </code></pre> <p>ikincisi izin verilir, ancak eski değildir:

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

, bu durumda neden olarak karıştı: derleyici aşağıdaki hata verir.

+0

Darn:

bir üst türü ekleme düzeltmek için. Basit bir arama ile bulamadım; Sorunun başlığında "lateinit" kelimesini dahil etmeyi öneriyorum, çünkü bu sizin sorunlarınız için ilk etapta tetikleyicidir. –

cevap

32

Diğer bir deyişle, (http://kotlinlang.org/docs/reference/generics.html#generic-constraints)

"(belirtilmediyse) üst sınır varsayılan Any? ise" Eğer T kullandığınızda, Kotlin olmak, bu herhangi bir tip olabileceğini varsayar ilkel, nesne veya null bir başvuru.

TL; DR; o, ben kendim gönderebilir ve bu soruyu cevaplamak için gittiğini

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

ve BTW, 'T? 'Sözdizimine izin verilmez, bu nedenle teknik olarak YOK tutarsızlık yoktur. – voddan

+2

'T?' 'T' kullanılmasına izin verilir,' T' beyanı değil. Yani val x: T? Geçerli. –

+0

T üzerinde daha fazla okuyabilirsiniz? burada https://medium.com/@igorwojda/kotlin-deep-dive-into-generics-nullability-9853d9a9f50d –