Câu trả lời:
Chúng được gọi là các loại nền tảng và điều đó có nghĩa là Kotlin không biết giá trị đó có thể hoặc không thể null
và bạn phải quyết định xem nó có thể là null hay không.
Tóm lại, vấn đề là mọi tham chiếu đến từ Java đều có thể là null và theo yêu cầu của Kotlin, không an toàn theo thiết kế, buộc người dùng phải kiểm tra null mọi giá trị Java hoặc sử dụng các xác nhận an toàn (
?.
) hoặc không xác nhận ()!!
). Đó là những tính năng rất tiện dụng trong thế giới Kotlin thuần túy, có xu hướng biến thành thảm họa khi bạn phải sử dụng chúng quá thường xuyên trong cài đặt Kotlin / Java.Đây là lý do tại sao chúng tôi đã thực hiện một cách tiếp cận triệt để và làm cho hệ thống loại của Kotlin trở nên thoải mái hơn khi nói đến Java interop: bây giờ các tài liệu tham khảo đến từ Java có các loại được đánh dấu đặc biệt - Blog của Kotlin
Đó là ký hiệu cho các loại nền tảng :
T!
có nghĩa là " T
hoặc T?
"
T
có nghĩa là " T!
hoặc T?
"
T
đã được thực hiện "không thể rỗng" và phần còn lại ít nhiều tùy ý
Loại !
được ký hiệu được gọi là loại nền tảng , là loại đến từ Java và do đó rất có thể là null
. Đó là những gì trình biên dịch Kotlin mặc định khi gọi Java (đối với các trường hợp cơ bản nhất, các phương thức Java có thể được chú thích để giải quyết vấn đề này). Bạn nên xử lý các loại nền tảng như nullable loại, trừ khi bạn chắc chắn biết rằng API cụ thể sẽ không bao giờ quay trở lại null
. Trình biên dịch cho phép các loại nền tảng được gán cho các biến của cả hai loại nullable và không null.
[...]
T!
có nghĩa là "T or T?
" [...]
Bạn có thể gọi các loại nền tảng là "các loại không xác định được ". Ngoài ra, điều quan trọng cần biết là bạn không thể sử dụng loại dấu chấm than cho các loại của riêng bạn, nó không phải là một phần của cú pháp Kotlin, đó chỉ là một ký hiệu .
Tên loại hoặc tên lớp kết thúc bằng dấu chấm than đơn !
được gọi là Loại nền tảng trong Kotlin. Bạn tìm thấy chúng khi bạn đang làm việc trong Kotlin với mã Java cũ không chứa thông tin vô hiệu.
Ví dụ:
@Nullable String
trong Java được coi là String?
bởi Kotlin.
@NotNull String
trong Java được coi là String
bởi Kotlin.
String
không có chú thích trong Java được coi là String!
bởi Kotlin.
Bạn có thể làm việc với một loại nền tảng là nullable hoặc non-null. Trình biên dịch sẽ cho phép bạn gọi tất cả các phương thức trên loại này. Trách nhiệm của bạn là làm thế nào để sử dụng chúng. Nếu bạn biết rằng giá trị có thể là null, bạn nên so sánh nó với null trước khi bạn gọi các phương thức trên nó. Nếu bạn biết nó không phải là null, bạn có thể sử dụng nó trực tiếp nhưng như trong Java, bạn sẽ có ngoại lệ nếu giả định của bạn về tính không hợp lệ là sai.
Lưu ý rằng bạn không thể khai báo các loại nền tảng trong mã Kotlin, chúng chỉ đến từ mã Java.
Trong khi ghi đè các phương thức Java trong mã Kotlin, bạn có tùy chọn khai báo các tham số và trả về các kiểu là null hoặc không null. Bạn cần chọn điều này một cách khôn ngoan, bởi vì nếu bạn quyết định làm cho các tham số trở thành null, trình biên dịch Kotlin tạo ra các xác nhận không null cho các tham số không null này. Và khi lần sau bạn truy cập mã Kotlin này từ Java và bạn chuyển một giá trị null, bạn sẽ có ngoại lệ.
Hy vọng rằng sẽ giúp xóa tất cả nghi ngờ của bạn về các loại nền tảng.
Tôi đã thấy nó một vài lần, đặc biệt là khi sử dụng API Java
Như đã đề cập bởi s1m0nw1, T!
có nghĩa là T or T?
. Câu hỏi tiếp theo là: cái gì T?
? Điều này được ghi lại độc đáo tại https://kotlinlang.org/docs/reference/null-safe.html . Kotlin không cho phép một số yếu tố nhất định null
, ví dụ String
, không giống như Java
Để cho phép null, chúng ta có thể khai báo một biến là chuỗi nullable, String được viết?:
var b: String? = "abc" b = null // ok
[...]
b?.length
Điều này trả về b.length nếu b không null và nếu không thì null. Loại biểu thức này là
Int?
.
Trích từ các loại nền tảng trong Kotlin :
Bên cạnh việc chỉ định rõ ràng một loại là tùy chọn (ví dụ
Person?
), Kotlin trình bày cho chúng tôi một con thú khác, được gọiPlatform Type
, được chỉ định bằng cách đặt một dấu chấm than duy nhất thay thế (ví dụPerson!
). Khái niệm này đã được tạo ra vì lý do tương thích, khi truy cập mã từ các nền tảng không an toàn như Java. Thông thường, khi sử dụng thư viện Java, nhiều phương thức sẽ trả vềSomeType!
, vì trình biên dịch Kotlin không thể suy ra nếu kết quả là nullable hay không.
Ví dụ:
(Mutable)Collection<T>!
Chỉ có nghĩa như sau: " Bộ sưu tập T của Java có thể thay đổi hoặc không, có thể là nullable hoặc không ".
Hi vọng điêu nay co ich.
platform types