سؤال
أواجه صعوبة في محاولة معرفة ذلك. قل لدي الكود التالي:
class Animal { }
class Mammal extends Animal { }
class Giraffe extends Mammal { }
...
public static List<? extends Mammal> getMammals() { return ...; }
...
public static void main(String[] args) {
List<Mammal> mammals = getMammals(); // compilation error
}
لماذا تؤدي المهمة إلى خطأ في الترجمة؟ الخطأ هو شيء مثل:
Type mismatch: cannot convert from List<capture#4-of ? extends Mammal> to List<Mammal>
وفقا لفهي التباين، getMammals()
طريقة إرجاع أ list
سوف تحتوي دائما على Mammal
الكائنات لذلك يجب أن تكون قابلة للتسلية. ماذا ينقصني؟
المحلول
لأن getMammals
يمكن أن تعاد أ List<Giraffe>
, ، وإذا كان ذلك قابل للتحويل إلى List<Mammal>
ثم تكون قادرا على إضافة Zebra
لذلك. لا يمكنك السماح بإضافة Zebra
إلى قائمة Giraffe
, ، هل تستطيع؟
class Zebra extends Mammal { }
List<Giraffe> giraffes = new List<Giraffe>();
List<Mammal> mammals = giraffes; // not allowed
mammals.add(new Zebra()); // would add a Zebra to a list of Giraffes
نصائح أخرى
حسنا، لا يعمل مثل هذا لسوء الحظ.
عندما تعلن عن الأجسام () للعودة List<? extends Mammal>
وهذا يعني أنه يمكن العودة List<Mammal>
أو List<Giraffe>
لكن لا List<Animal>
يجب أن تبدو الرئيسية الخاصة بك () مثل هذا:
public static void main(String[] args) {
List<? extends Mammal> mammals = getMammals();
Mammal mammal = mammals.get(0);
}
تحرير: فيما يتعلق بالبغاء، هذا ما يقصد عادة بهذا:
class Animal {
public Animal getAnimal() {return this;}
}
class Mammal extends Animal {
public Mammal getAnimal() {return this;}
}
class Giraffe extends Mammal {
public Giraffe getAnimal() {return this;}
}
كما ترون، يسمح بتحميل نوع الإرجاع من الأساليب عند تجاوز الطريقة.