تغيير منشئ المعلمة الطبقة فواصل نوع في جرة أخرى
-
05-07-2019 - |
سؤال
ولدي الطبقة التالية في جرة المشتركة:
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
؟
وأعتقد أنه يمكن أن يكون مشكلة مع الإصدار المكتبة. هل أنت متأكد من أن ليست هناك نسخة أخرى من المكتبة المشتركة في مكان آخر في نفس السياق؟