ما هو PECS (Producer Extends Consumer Super) في Java generics؟
مرحبًا بالجميع! لقد كنت أكتب بلغة Java لعدة أشهر، لكني ما زلت مرتبكًا بشأن wildcards في generics. قرأت عن PECS، لكن عمليًا لا أفهم متى أستخدم `? extends T` ومتى أستخدم `? super T`.
إليك مثال محدد يربكني. لدي طريقة يجب أن تنسخ العناصر من قائمة إلى أخرى:
```java
public static void copy(List> src, List> dest) {
for (Object item : src) {
dest.add(item); // خطأ في الترجمة!
}
}
```
المترجم يشتكي من `dest.add(item)`. أفهم أنني بحاجة لاستخدام bounded wildcards، لكني لا أستطيع فهم أي منها بالضبط.
لنفترض أن لدي تسلسلًا هرميًا للفئات: `Animal` ← `Dog` ← `Puppy`. أريد كتابة طريقة:
1. تقرأ الكائنات من قائمة (مثل قائمة `Dog`)
2. تكتبها في قائمة أخرى (مثل قائمة `Animal`)
كيف أعلن الأنواع بشكل صحيح لـ `src` و `dest`؟ وماذا يعني اختصار PECS؟ سأكون ممتنًا لشرح مفصل مع أمثلة.