سؤال

ولدي الطبقة التالية في جرة المشتركة:

public class Common 
{
  public Common(List list)
  {
    ...  
  }  
}

وبعد ذلك تغيير المعلمة المنشئ من List إلى Collection كما يلي:

public class Common 
{
  public Common(Collection collection)
  {
    ...
  }
}

وإعادة بناء جرة المشتركة وتشغيل نظام يؤدي إلى NoSuchMethodError في أي فئة تعتمد عندما استدعاء منشئ حتى أنا إعادة ترجمة تلك الفئة.

ولقد حصلت على بعض الأفكار ما يسبب هذا، على غرار الطريقة لا بد من البناء في بايت كود الطبقة التابعة، لكنني لست متأكدا 100٪.

يرجى شخص ما يمكن أن يلقي بعض الضوء على ما يحدث هنا؟

تحديث

ولقد فعلت بعد ذلك اختبار سريع وأخذ نظرة على بايت كود:

Compiled from "Client.java"
public class Client extends java.lang.Object{
public Client();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   new #2; //class ArrayList
   3:   dup
   4:   invokespecial   #3; //Method java/util/ArrayList."<init>":()V
   7:   astore_1
   8:   new #4; //class Common
   11:  dup
   12:  aload_1
   13:  invokespecial   #5; //Method Common."<init>":(Ljava/util/List;)V
   16:  pop
   17:  return

}

ومثل توم وقال، وكما ترون على خط 13، لا بد المنشئ المحدد في وقت الترجمة.

وتتعلم شيئا جديدا كل يوم: -)

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

المحلول

وjavac يحل بالضبط الطريقة التي أو المنشئ للاتصال في وقت الترجمة. هذا لا يحدث في وقت الارتباط. كما تغير التوقيع منشئ، الخطوة ربط لا يمكن العثور على طريقة المطلوبة وبالتالي يلقي خطأ. يمكنك إصلاح الخطأ من خلال تزويد الصانعين - واحد الذي يأخذ Collection وList البعض. في وقت لاحق منشئ أخذ Iterable يمكن إضافة.

ملحوظة، الأنواع العامة لا تشكل جزءا من التوقيع، حتى تلك التي يمكن تغييرها بينما لا تزال تحتفظ التوافق الثنائية. تشكل كل من المعلمة والعودة أنواع جزء من التوقيع لأساليب (عوائد التغاير تسبب أساليب جسر الاصطناعية التي ستنشأ).

وهناك في JLS تحديد بالضبط ما يشكل تغيرات تتناسب الثنائية.

نصائح أخرى

هل استيراد قائمة وجمع الصفوف الصحيحة؟ أي java.util.List وjava.util.Collection؟

وأعتقد أنه يمكن أن يكون مشكلة مع الإصدار المكتبة. هل أنت متأكد من أن ليست هناك نسخة أخرى من المكتبة المشتركة في مكان آخر في نفس السياق؟

scroll top