الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

wildcard generic types

بدأه vector_ever في 8 مايو 2012 · 2 رد · 387 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم لدي سؤال بسيط حول الـ wildcard generic types

حيث انه هناك ثلاثة أنواع وهي

1- A<?>
2- A<? extends B>
3- A<? super B>

الآن السؤال ما هو الفرق بين النوع الآول والنوع الثاني؟

بالنسبة للنوع الثالث فهو واضح ومفهوم ولا حاجة لي لشرحه فقط يحدث لدي التباس بين النوعين الأوليين لانني الا حظ انه تقريبا لا فرق بينهما مع عدم اقتناعي بهه الفكرة

وشكرا

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


#2
1- A<?>

يمثل نوع اي نوع مثل ما تستخدم T,E ولكن لا يمكن ان تعرفه كاسم نوع

مثلا التالي صحيح

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author PsychoMantis
 */
public class CollectionApp {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        CollectionApp cApp = new CollectionApp();
        List<String> arr = new LinkedList<String>();
        List<Integer> i = new LinkedList<Integer>();
        arr.add("One");
        arr.add("Two");
        arr.add("Three");
        i.add(1);
        i.add(2);
        i.add(3);
        cApp.print(arr);
        cApp.print(i);
    }
    public void print(List< ? > x){

        for(int i = 0; i<x.size();i++){
            System.out.println(x.get(i));
        }
    }
}

ولكن التالي خاطئ

public <?> void print(List< ? > x){

        for(int i = 0; i<x.size();i++){
            System.out.println(x.get(i));
        }
    }

A<? extends B>

اعتقد انه من المثال الاول لقد اتضحت لك الرؤيه حيث في المثال الثاني A اي نوع يرث من B بما في ذلك B

لو قمت بتغيير المثال الاول بحيث الدالة تصبح هكذا

public  void print(List< ? extends Number> x){

        for(int i = 0; i<x.size();i++){
            System.out.println(x.get(i));
        }
    }

فان الاستدعاء

cApp.print(arr);

غير صحيح لانه ليست من نوع سترينغ والاسترينغ لا يرث من Number

بينم االاستدعاء الثاني يظل قائم لانه Integer يرث من Number

لو اردنا تعريف اسم نوع يرث من Number يجب في هذه الحاله عمل التالي

public <T extends Number> void print(List< T > x){

        for(int i = 0; i<x.size();i++){
            System.out.println(x.get(i));
        }
    }

لاحظ انك لو عملت التالي لكان خطأ

public <? extends Number> void print(List< ? > x){

        for(int i = 0; i<x.size();i++){
            System.out.println(x.get(i));
        }
    }

لمزيد من المعلومات

Java Collection Gilad Bracha

مع اني افترض انك قد قمت بقراءة هذه الورقه المميزه

تحياتي

1

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#3

الله يعطيك العافية والله شرح ولا أروع كفيت ووفيت

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


مواضيع مشابهة