Dấu chấm than duy nhất trong Kotlin


141

Dấu chấm than duy nhất có ý nghĩa gì trong Kotlin? Tôi đã thấy điều đó một vài lần, đặc biệt là khi sử dụng API Java. Nhưng tôi không thể tìm thấy nó trong tài liệu cũng như trên StackOverflow.

Câu trả lời:


154

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ể nullvà 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


2
Đó là tất cả những gì tốt nói và làm. Tuy nhiên, tôi chỉ cảm thấy không tốt khi gọi nóplatform types
JaydeepW

61

Đó là ký hiệu cho các loại nền tảng :

T!có nghĩa là " Thoặc T?"


Tại sao không Tcó nghĩa là " T!hoặc T?"
Arst

T! có nghĩa là không nullable, T? có nghĩa là vô giá trị. Tại sao Kotlin không làm điều đó ...
Arst

4
Bởi vì mặc định tốt nhất là "không thể rỗng" vì những lý do rõ ràng và đó là một thiết kế tốt để mặc định là chữ ký loại ngắn nhất. Do đó, Tđã được thực hiện "không thể rỗng" và phần còn lại ít nhiều tùy ý
voddan

13

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.

Ký hiệu cho các loại nền tảng

[...]

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 .


Các cụm từ như 'có lẽ nhất' không giúp đỡ
Ewan

9

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ụ:

Thông tin Nullable: Loại Nullable

@Nullable Stringtrong Java được coi là String?bởi Kotlin.

Thông tin không null: Loại không null

@NotNull Stringtrong Java được coi là Stringbởi Kotlin.

Không có thông tin: Loại nền tảng

Stringkhông có chú thích trong Java được coi là String!bởi Kotlin.


Làm thế nào để đối phó với các loại nền tảng?

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.


Kế thừa và các loại nền tảng

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.


3

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?.


0

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ọi Platform 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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.