سؤال

وأنا أحاول أن أفهم سلوك جافا. باستخدام هذه الواجهات:

public interface IA {}
public interface IB extends IA {}
public class myClass implements IB {}

وأنا الحمولة الزائدة طريقة مثل هذا:

public void method(IA a);
public void method(IB b);

عند استدعاء الأسلوب مع الكائن التالي:

IA a = new myClass();
method(a);

لماذا استخدام جافا:

 public void method(IA a);

وبدلا من

public void method(IB b);

والشكر

هل كانت مفيدة؟

المحلول

ولأن المترجم لا يعرف سوى أن a هو مثيل IA. يتم تحديد الزائدة في وقت الترجمة تعتمد على أنواع وقت الترجمة من التعبيرات ذات الصلة، ونوع وقت الترجمة من a هو IA.

و(قارن هذا مع الغلابة، حيث يتم اختيار تطبيق الأسلوب في <م> التنفيذ وقت بناء على نوع الفعليين.)

نصائح أخرى

وخط

 IA a = new myClass();

ويحدد كائن كنوع IA وهذا هو كل شيء المترجم يعرف. لا يمكن أن نفترض أن هو أيضا IB لأنه من الممكن تماما لهذا أن يكون صحيحا:

 public class MyClass2 implements IA{}

 IA a = new MyClass2();
 method(a);

وفي هذه الحالة هو لا IB كما في المثال الخاص بك. وبالتالي فإن المترجم يجعل أية افتراضات حول نوع آخر من ما تقدم. لذلك يجب أن استدعاء الأسلوب الذي يقبل IA.

ولأن يتم تمرير "أ"، والذي هو حجة IA.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top