الفرق بين `*` و `Any` في الأدوية العامة في Kotlin: النجمة مقابل Any
مرحباً بالجميع! بدأت تعلم Kotlin مؤخراً وواجهت نقطة غير واضحة في الأدوية العامة.
في التوثيق، رأيت أنه يمكن استخدام `*` (star projection) في الأدوية العامة، وكذلك يمكن كتابة ``. للوهلة الأولى، يبدو أنهما يفعلان نفس الشيء — يسمحان بتخزين أي نوع في المجموعة. لكني أشعر أن هناك فرقاً مهماً بينهما.
على سبيل المثال، أكتب هذا الكود:
```kotlin
val list1: MutableList = mutableListOf("سلسلة", 42, 3.14)
val list2: MutableList<*> = mutableListOf("سلسلة", 42, 3.14)
```
كلا المتغيرين يعملان، ويمكنني إضافة أي عنصر إليهما. ولكن إذا حاولت قراءة عنصر وتعيينه لمتغير بنوع محدد، تظهر بعض الغرائب.
إذا كتبت:
```kotlin
val item1: String = list1[0] // خطأ في الترجمة؟ أم لا؟
val item2: String = list2[0] // وهنا؟
```
الخيار الأول يتم ترجمته، بينما الثاني لا. لماذا؟ وما الفرق بين `*` و `Any`؟ ومتى نستخدم أياً منهما؟ اشرحوا لي، من فضلكم.