متغير نوعي

في نظرية الأنواع ولغات البرمجة ، يُعدّ متغير النوع متغيرًا رياضيًا يشمل جميع الأنواع . حتى في لغات البرمجة التي تسمح بالمتغيرات القابلة للتغيير ، يظل متغير النوع مجردًا، بمعنى أنه لا يرتبط بمواقع ذاكرة محددة.

تستخدم لغات البرمجة التي تدعم تعدد الأشكال البارامتري متغيرات النوع المُكمَّمة عالميًا . أما اللغات التي تدعم الأنواع الوجودية فتستخدم متغيرات النوع المُكمَّمة وجوديًا . على سبيل المثال، يُعرّف كود OCaml التالي دالة هوية متعددة الأشكال ذات نوع مُكمَّم عالميًا، والتي يطبعها المفسر في السطر الثاني:

# let id x = x ;; val id : ' a -> ' a = < fun >

في الترميز الرياضي، يكون نوع الدالة idهوأ.أأ{\displaystyle \forall aa\to a}، أينأ{\displaystyle a}هو متغير نوع.

البرمجة العامة

في البرمجة العامة ، يُستخدم مُعامل النوع أو مُعامل القالب للدلالة على النوع (أو الأنواع) التي يمكن استخدامها. تُعدّ مُعاملات النوع هذه بمثابة عناصر نائبة للأنواع التي سيتم تحديدها لاحقًا، مما يسمح للبرنامج بالعمل مع أنواع مختلفة مع الحفاظ على سلامة النوع. عادةً ما تُكتب مُعاملات النوع بحرف كبير واحد.

واجهة List <E> { void add ( E x ) ; Iterator <E> iterator ( ) ; }واجهة Map < K , V > { V put ( K key , V value ); V get ( Object key ); }

في بعض اللغات، يمكن تحديد هذه المعاملات بحيث يكون لها أنواع افتراضية . على سبيل المثال، في لغة C++ :

template < typename T = int > class Box { private : T value ; public : explicit Box ( T value ) : value { value } {}// ... };Box <double> b1 ( 13.5 ) ; Box < > b2 ( 5 ); // هذا هو Box<int>

تُقدّم بعض اللغات شكلاً إضافياً لتقييد هذه المعاملات النوعية، يُسمى فئات الأنواع . تُقدّم لغة C++ مفاهيم وشروطاً requires، [ 1 ] بينما تُقدّم لغات C# و Kotlin و Rustwhere شروطاً، [ 2 ] [ 3 ] أما لغة Java فتُقدّم extendsمُؤهِّلات super. كما تُقيّد واجهات Go النوع بحيث يجب عليه تنفيذ أساليب مُحدّدة. [ 4 ]

باستخدام النظام ؛public class MyGenericClass < T , U > where T : IComparable <T> , allows ref struct where U : class , notnull , new ( ) { // ... }

بالإضافة إلى ذلك، توفر لغة جافا مُعاملات أنواع عامة تسمح بتنوعات أي مُعاملات لنوع عام. يُرمز لهذه المُعاملات بـ ` <type>? `، على سبيل المثال ` <type> `. [ 5 ] يوجد هذا أيضًا في لغة كوتلن، ولكن يُرمز له بـ `<type> ` بدلاً من `<type>`. في لغة رست، يمكن ترك مُعامل النوع العام غير مُحدد ليقوم المُترجم بتفسيره باستخدام `<type>` ، وهو ما يُسمى "النوع المُستنتج" (على سبيل المثال `<type> `). [ 6 ]List<?>*_Vec<_>

في اللغات ذات الكتابة الديناميكية، على الرغم من أن تحديد أنواع البيانات قد لا يكون جزءًا أساسيًا من اللغة، إلا أنه يمكن توفير بعض الميزات لمحاكاتها. على سبيل المثال، في بايثون ، لا يزال من الممكن تمثيل متغيرات النوع وتحديدها باستخدام الفئة . [ 7 ]typing.TypeVar

من typing استورد TypeVarT : TypeVar = TypeVar ( 'T' )def first_item ( items : list [ T ]) -> T : return items [ 0 ]

انظر أيضاً

مراجع

  1. cppreference.com (6 يونيو 2026). "القيود والمفاهيم" . cppreference.com . cppreference.com.
  2. "حيث (قيد النوع العام)" . learn.microsoft.com . مايكروسوفت ليرن. 30 يوليو 2024.
  3. "الأنواع العامة: في، خارج، أين في كوتلين" . kotlinlang.org . JetBrains sro . تم ​​الاطلاع عليه بتاريخ 15 أكتوبر 2025 .
  4. مؤلفو لغة Go. "جولة في واجهات Go" . go.dev . مؤلفو لغة Go . تم ​​الاطلاع عليه بتاريخ 5 مايو 2026 .
  5. "الفصل 4. الأنواع والقيم والمتغيرات" . docs.oracle.com . تم الاطلاع عليه بتاريخ 2020-11-03 .
  6. مطورو لغة Rust (16 يونيو 2026). "النوع المُستنتج" . doc.rust-lang.org . مرجع لغة Rust.
  7. مؤسسة برمجيات بايثون (10 مايو 2026). "الكتابة - دعم تلميحات النوع" . docs.python.org . مؤسسة برمجيات بايثون.