2017-02-03 16 views
7

Tôi mới đến Kotlin và tôi không biết tại sao biên dịch phàn nàn về mã này:Kotlin lớp dữ liệu và các loại nullable

data class Test(var data : String = "data") 

fun test(){ 
    var test: Test? = Test("") 
    var size = test?.data.length 
} 

Compiler phàn nàn với test?.data.length, nó nói rằng tôi nên làm: test?.data?.length. Nhưng biến dữ liệu là String, không phải String?, vì vậy tôi không hiểu tại sao tôi phải đặt ? khi tôi muốn kiểm tra độ dài.

Trả lời

10

Biểu thức test?.data.length tương đương với (test?.data).length và phần test?.data không thể thực hiện được: đó là test.data hoặc null. Do đó, không an toàn để có được length, nhưng thay vào đó bạn nên sử dụng lại safe call operator: test?.data?.length.

Tính vô hiệu được truyền qua toàn bộ chuỗi cuộc gọi: bạn phải viết các chuỗi này là a?.b?.c?.d?.e (tức là, một lần nữa, tương đương với (((a?.b)?.c)?.d)?.e), phần còn lại của cuộc gọi không thể được thực hiện như thể giá trị không phải là null.

+0

Ok, tôi hiểu ngay bây giờ. Cảm ơn bạn rất nhiều! –

3

Nếu bạn không muốn sử dụng cuộc gọi an toàn trước khi mỗi thành phần không nullable của chuỗi cuộc gọi, bạn có thể nhận được kết quả của các cuộc gọi an toàn đầu tiên vào một biến mới với các chức năng mở rộng tiêu chuẩn run hoặc let:

// `this` is non-nullable `Test` inside lambda 
val size = test?.run { data.length } 

// or: `it` is non-nullable `Test` inside lambda 
val size = test?.let { it.data.length } 

Lưu ý rằng size vẫn không thể sử dụng được Int? tại đây.

+0

Cảm ơn bạn rất nhiều! –

Các vấn đề liên quan