java مشاريع لماذا لا يمكنني تمرير وسيطة النوع بشكل واضح إلى أسلوب جافا عام؟




مشاريع الفيجوال بيسك جاهزة (4)

لقد حددت وظيفة جافا:

static <T> List<T> createEmptyList() {
    return new ArrayList<T>();
}

طريقة واحدة للاتصال به هي كما يلي:

List<Integer> myList = createEmptyList(); // Compiles

لماذا لا أستطيع أن أسميها عن طريق تمرير صراحة نوع الوسيطة العامة؟ :

Object myObject = createEmtpyList<Integer>(); // Doesn't compile. Why?

أحصل على خطأ Illegal start of expression من مترجم.


يمكنك، إذا كنت تمر في نوع كمعلمة الأسلوب.

static <T> List<T> createEmptyList( Class<T> type ) {
  return new ArrayList<T>();
}

@Test
public void createStringList() {
  List<String> stringList = createEmptyList( String.class );
}

لا يمكن أن يتم إضفاء الطابع العام على الأساليب بالطريقة نفسها التي يمكن أن يكون بها النوع، وبالتالي فإن الخيار الوحيد لطريقة ذات نوع عائد عام مكتوب ديناميكيا - فيو وهو فمه :-) - هو تمريره في النوع كوسيطة.

للحصول على أسئلة وأجوبة ممتازة حقا على جيني الأدوية، انظر أنجلكا لانجر للأدوية أسئلة وأجوبة .

.
.

متابعة:

لن يكون من المنطقي في هذا السياق استخدام حجة المصفوفة كما في Collection.toArray( T[] ) . السبب الوحيد هو استخدام مجموعة هناك لأن نفس (قبل تخصيص) مصفوفة يستخدم لاحتواء النتائج (إذا كان المصفوفة كبيرة بما فيه الكفاية لتناسب كل منهم في). هذا يوفر على تخصيص مصفوفة جديدة في وقت التشغيل في كل وقت.

ومع ذلك، لأغراض التعليم، إذا كنت ترغب في استخدام كتابة الصفيف، وبناء الجملة هي مشابهة جدا:

static <T> List<T> createEmptyList( T[] array ) {
  return new ArrayList<T>();
}

@Test
public void testThing() {
  List<Integer> integerList = createEmptyList( new Integer[ 1 ] );
}

عندما يتعذر على المترجم جافا استنتاج نوع المعلمة في حد ذاته لطريقة ثابتة، يمكنك دائما تمريرها باستخدام اسم الأسلوب المؤهل الكامل: الفئة. <تايب> ميثود ()؛

Object list = Collections.<String> emptyList();

pauldoo نعم، أنت على حق تماما. انها واحدة من نقاط الضعف مع جيما الأدوية إيمهو.

رد على تشيكيسوفت أود أن أقترح أن ننظر أيضا في كيفية القيام به من قبل الشعب جافا أنفسهم، مثل T [] أبستراكتكولكتيون # تواراي (T [] أ). أعتقد أن نسخة تشيكيسوفتس متفوقة، ولكن جافا واحد لديه ميزة الألفة.

تعديل: إضافة رابط. إعادة التعديل: العثور على خطأ في سو :)

متابعة تشيكيسوفت: حسنا، كما هو قائمة من نوع ما يجب أن تعاد المثال المقابل يجب أن ننظر إلى شيء مثل:

static <T> List<T> createEmptyList( List<T> a ) {
  return new ArrayList<T>();
}

ولكن نعم، تمرير الكائن الطبقة هو بوضوح أفضل واحد. حجتي الوحيدة هي أن الألفة، وفي هذه الحالة بالضبط لا يستحق الكثير (في الواقع أنه سيئ).


لقد كان بعض الوقت منذ أن حفرت في تلك الأجزاء من جاوة، ولكن ...

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







syntax