الطريقة الأكثر تحديدا مع تطابقات كل من القضاء الثابت / المتغير (varargs)

StackOverflow https://stackoverflow.com/questions/1321657

  •  19-09-2019
  •  | 
  •  

سؤال

في القسم 15.12.2.5 من مواصفات لغة Java, ، يتحدث عن كيفية اختيار الطريقة الأكثر تحديدا في كلتا الحالتين من الأساليب ذات القضاء الثابت وطرق القضاء المتغير (أي varargs).

ما لا يمكنني العثور عليه في JLS هو أي شيء حول اتخاذ قرار بين طريقتين حيث واحد من الحنان الثابت وواحد من القضاء المتغير ومع ذلك. علي سبيل المثال:

public interface SomeApi {
    public String getSomething(String arg);       // method 1
    public String getSomething(String ... args);  // method 2
}

يجمع على ما يرام كما يتوقع المرء (لأسباب موضحة يوني أدناه). تجميع رمز الاتصال هذا أيضا:

SomeApi api = ...
Object o = api.getSomething("Hello");

وإذا قمت بتشغيله، method #1 (أي طريقة غير varargs) يسمى. لماذا هذا مكالمة رمز غير غامض؟ لماذا هي طريقة Arity الثابتة أكثر تحديدا من متغير واحد؟ هل يمكن لشخص ما أن يشير لي إلى القليل ذي الصلة من المواصفات؟

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

المحلول

تعتبر مرحلة حل الأسلوب الأول فقط أساليب Arity ثابتة ويتم إنهاء العملية في حالة العثور على تطابق، قبل النظر في أي طرق Varargs.

من http://docs.oracle.com/javase/specs/jls/se6/html/express.html#15.12.2.2.

15.12.2.2 المرحلة 1: تحديد مطابقة arity. الأساليب المطبقة عن طريق فرعي

إذا لم يتم العثور على أي طريقة تنطبق عن طريق الفرعي، فإن البحث عن الطرق المعمول به يستمر مع المرحلة 2 (§ 15.12.2.3). خلاف ذلك، يتم اختيار الطريقة الأكثر تحديدا (§ 15.12.2.5) بين الأساليب التي تنطبق عن طريق فرعي.

(التركيز.)

نصائح أخرى

لا أستطيع توجيهك إلى المواصفات، ولكن منطقيا،

getSomething(String...args) 

يترجم إلى

getSomething(String[] args)

مع عدم وجود الغموض

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