Sự khác biệt giữa “*” và “Bất kỳ” trong các chỉ số chung của Kotlin


106

Tôi không chắc mình hoàn toàn hiểu sự khác biệt giữa SomeGeneric<*>SomeGeneric<Any>. Tôi nghĩ *đại diện cho bất cứ thứ gì (thẻ Anyđại diện ) và đại diện cho đối tượng mà TẤT CẢ các đối tượng kế thừa từ đó. Vì vậy, có vẻ như họ nên giống nhau, nhưng họ phải không?

Câu trả lời:


158

Có thể hữu ích khi nghĩ về phép chiếu sao như một cách để đại diện không chỉ cho bất kỳ loại nào, mà còn là một số loại cố định mà bạn không biết chính xác là gì.

Ví dụ: kiểu MutableList<*>đại diện cho danh sách một cái gì đó (bạn không biết chính xác là gì). Vì vậy, nếu bạn cố gắng thêm một cái gì đó vào danh sách này, bạn sẽ không thành công. Nó có thể là một danh sách các Strings, hoặc một danh sách các Ints, hoặc một danh sách các thứ khác. Trình biên dịch sẽ không cho phép đưa bất kỳ đối tượng nào vào danh sách này vì nó không thể xác minh rằng danh sách chấp nhận các đối tượng thuộc loại này. Tuy nhiên, nếu bạn cố gắng lấy một phần tử ra khỏi danh sách như vậy, chắc chắn bạn sẽ nhận được một đối tượng kiểu Any?, bởi vì tất cả các đối tượng trong Kotlin đều kế thừa từ đó Any.

Từ asco bình luận bên dưới:

Ngoài ra, List<*>có thể chứa các đối tượng thuộc bất kỳ loại nào, nhưng chỉ có loại đó, vì vậy nó có thể chứa Chuỗi (nhưng chỉ Chuỗi), trong khi List<Any> có thể chứa Chuỗi và Số nguyên và không chứa, tất cả trong cùng một danh sách.


83
Câu trả lời hay, đối với một số người, có thể hữu ích khi thêm rằng Danh sách <*> có thể chứa các đối tượng thuộc bất kỳ kiểu nào , nhưng chỉ có kiểu đó, vì vậy nó có thể chứa Chuỗi (nhưng chỉ Chuỗi), trong khi Danh sách <Any> có thể chứa Chuỗi và Số nguyên và whatnot, tất cả trong cùng một danh sách.
fweigl

1
Dưới đây là một bài viết thú vị với một lời giải thích tương tự: typealias.com/guides/star-projections-and-how-they-work
cá sấu

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.