English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا الدرس، سنكتشف كيفية استخدام الأصناف الجينية في Java، وكيفية إنشاء صنف جيني ومتدخل جيني وأفضليته.
في Java،الأنواع العامةيساعد في إنشاء صنف، واجهة، ومتدخل يمكن استخدامه مع أنواع مختلفة من الأنواع (بيانات). لذلك، يسمح لنا بإعادة استخدام شفرتنا.
التعليقالترجمةالأنواع العامةالجينيات غير مناسبة للأنواع الأساسية (int، float، char، إلخ).
للتعرف على كيفية استخدامالأنواع العامة، يمكننا استخدام صنف من إطار العمل Java Collection.
مثال على صنف قائمي (泛型). يمكننا استخدام قائمة من الأعداد الصحيحة لتحتوي على أي نوع بيانات. على سبيل المثال
import java.util.ArrayList; class Main { public static void main(String[] args) { //أنشئ قائمة من الأعداد الصحيحة لتحتوي على بيانات Integer ArrayList<Integer> list1 = new ArrayList<>(); list1.add(4); list1.add(5); System.out.println("قائمة من الأعداد الصحيحة: " + list1); //أنشئ قائمة من الأعداد النصية لتحتوي على بيانات String ArrayList<String> list2 = new ArrayList<>(); list2.add("أربعة"); list2.add("خمس"); System.out.println("قائمة من الأعداد النصية: " + list2); //أنشئ قائمة من الأعداد الصحيحة لتحتوي على بيانات Double ArrayList<Double> list3 = new ArrayList<>(); list3.add(4.5); list3.add(6.5); System.out.println("قائمة من الأعداد الصحيحة: " + list3); } }
نتائج الإخراج
ArrayList من Integer: [4, 5] ArrayList من String: [Four, Five] ArrayList من Double: [4.5, 6.5]
في المثال السابق، استخدمنا نفس فئة ArrayList لتحديد العناصر من النوع Integer، String و Double. بسببالجينريكات في Java، هذا ممكن.
في هذا السياق، لاحظ هذه السطر،
ArrayList<Integer> list1 = new ArrayList<>();
استخدمنا Integer في البارزات <>. البارزات <> تُدعى في الفئات الواسعة النطاقم 参数 النوع.
يُستخدم المعامل type لتعيين نوع البيانات (العدد) الذي يمكن أن يستخدمه الفئة أو الطريقة.
الآن بعد أن عرفنا كيف تعمل الفئات الواسعة النطاق في Java، دعونا نرى كيف يمكننا إنشاء فئات واسعة النطاق خاصة بنا.
class Main { public static void main(String[] args) { //استخدام بيانات العدد لتحديد فئة واسعة النطاق GenericsClass<Integer> intObj = new GenericsClass<>(5); System.out.println("تُرجع الفئة واسعة النطاق: " + intObj.getData()); //استخدام بيانات النص لتحديد فئة واسعة النطاق GenericsClass<String> stringObj = new GenericsClass<>("Java Programming"); System.out.println("تُرجع الفئة واسعة النطاق: " + stringObj.getData()); } } class GenericsClass<T> { //متغير النوع T private T data; public GenericsClass(T data) { this.data = data; } //طريقة عودة متغير النوع T public T getData() { return this.data; } }
نتائج الإخراج
تُرجع الفئة واسعة النطاق: 5 تُرجع الفئة واسعة النطاق: Java برمجة
في المثال السابق، قمنا بإنشاء فئة واسعة النطاق تُدعى GenericsClass. يمكن استخدام هذه الفئة لمعالجة أي نوع من البيانات.
class GenericsClass<T> {...}
في هذا السياق، T يمثلم 参数 النوعفي داخل فئة Main، قمنا بإنشاء أجرأة فئة GenericsClass تُدعى intObj وstringObj.
عند إنشاء intObj، يتم استبدال معامل النوع T بنوع Integer. مما يعني أن intObj يستخدم GenericsClass لمعالجة البيانات الصحيحة.
عند إنشاء stringObj، يتم استبدال معامل النوع T بنوع String. مما يعني أن stringObj يستخدم GenericsClass لمعالجة بيانات النصوص.
مثل الفئات الجينريكة، يمكننا أيضًا إنشاء طرق جينريكة خاصة بنا في Java.
class Main { public static void main(String[] args) { //استخدام بيانات Integer لتحديد الفئة DemoClass demo = new DemoClass(); demo.<String>genericMethod("Java Programming"); } } class DemoClass { //طريقة جينريك public <T> void genericMethod(T data) { System.out.println("هذه هي طريقة جينريك."); System.out.println("البيانات المقدمة للطريقة هي " + data); } }
نتائج الإخراج
هذه هي طريقة جينريك. البيانات المقدمة للطريقة هي: Java Programming
في المثال السابق، قمنا بإنشاء طريقة جينريك (genericsMethod) داخل فئة عادية (DemoClass).
public <T> void genericMethod(T data) {...}
في هذا السياق، يتم إدراج معامل النوع <T> بعد الميزة (public) وقبل نوع العودة (void).
يمكننا استدعاء طريقة الجينريك من خلال وضع نوع الحقيقة <String> في البارانtheses الموجودة أمام اسم الطريقة.
demo.<String>genericMethod("Java Programming");
ملاحظةفي معظم الحالات، يمكننا تجاهل معامل النوع عند استدعاء طريقة الجينريك. هذا لأن المسيج يمكنه استخدام القيمة المقدمة للطريقة لتطابق معامل النوع. على سبيل المثال،
demo.genericsMethod("Java Programming");
عادة،مفهوم typeيمكنه قبول أي نوع بيانات (استثناء الأنواع الأساسية). ولكن إذا كنا نريد استخدام الجينريك فقط لبعض الأنواع المحددة (مثل قبول بيانات أنواع الأرقام)، فإننا يمكننا استخدام أنواع محددة.
نستخدم كلمة المفتاح extends. على سبيل المثال،
<T extends A>
这意味着T只能接受A的子类型的数据。
class GenericsClass <T extends Number> { public void display() {}} System.out.println("This is a bounded type generics class."); } } class Main { public static void main(String[] args) { //إنشاء عنصر فئة GenericsClass GenericsClass<String> obj = new GenericsClass<>(); } }
في المثال السابق، قمنا بإنشاءbounded typesof the generic class. Please note the expression
<T extends Number>
هذا يعني أن T يمكن أن يستخدم فقط أنواع البيانات الفرعية لـ Number (Integer، Double وما إلى ذلك).
لكننا قمنا بإنشاء عنصر فئة عامة باستخدام String. هذا هو السبب في أننا سنحصل على خطأ التالي عند تشغيل البرنامج.
GenericsClass<String> obj = new GenericsClass<>(); ^ reason: inference variable T has incompatible bounds equality constraints: String lower bounds: Number where T is a type-variable: T extends Number declared in class GenericsClass
الأنواع العامةإنها تمكننا من كتابة كود يمكن استخدامه مع أنواع بيانات مختلفة. على سبيل المثال،
public <T> void genericsMethod(T data) {...}
في هذا السياق، قمنا بإنشاء طريقة عامة. يمكن استخدام هذه الطريقة للقيام بعمليات على بيانات الصحيح، النصوص، وما إلى ذلك.
الأنواع العامةمفهوم typeتوفير معلومات حول نوع البيانات المستخدمة في الكود الخاص بالأنواع العامة.
لذلك، يمكن اكتشاف أي أخطاء عند التجميع، مما يجعل إصلاح الأخطاء أسهل من الأخطاء عند التشغيل. على سبيل المثال،
//لا يستخدم الأنواع العامة NormalClass list = new NormalClass(); //دعوة طريقة فئة NormalClass list.display("String");
في الكود السابق، لدينا فئة عادية. نستدعي طريقة display() الموجودة في هذه الفئة من خلال إرسال بيانات النص.
في هذا السياق، لا يعلم المبرمج ما إذا كانت القيم التي يتم إيصالها كأ参数 صحيحة أم لا. ولكن دعونا نرى ما الذي سيحدث إذا استخدمنا نوعًا عامًا.
//استخدام الأنواع العامة GenericsClass<Integer> list = new GenericsClass<>(); // استدعاء طريقة GenericsClass list2.display("String"); في الكود السابق، لدينا فئة عامة. هنا، يمثل معامل النوع أنواع البيانات التي يتم معالجتها من قبل هذه الفئة. لذلك، عند إرسال بيانات النوع String كمعامل، سيقوم محرر الكود بإنشاء خطأ.
يستخدم إطار العمل للمجموعات مفهوم النوع العام في Java. على سبيل المثال،
// إنشاء ArrayList من النوع String ArrayList<String> list1 = new ArrayList<>(); // إنشاء ArrayList من النوع الصحيح ArrayList<Integer> list2 = new ArrayList<>();
في المثال السابق، استخدمنا نفس فئة ArrayList لمعالجة أنواع بيانات مختلفة.
مثل ArrayList، جميع المجموعات الأخرى (LinkedList، Queue، Maps، إلخ) هي أنواع عامة في Java.