🎓 موضوع: Generics در جاوا — حذف Type Casting و افزایش ایمنی نوع دادهها
در زبان Java، ویژگی Generics از نسخهی 5 معرفی شد تا بتوانیم نوع داده (Type) را بهصورت پارامتری تعریف کنیم. هدف اصلی Generics، افزایش ایمنی نوع (Type Safety) و حذف نیاز به Type Casting دستی است.
بهعنوان مثال:
در نسخههای قدیمیتر:
🔹 Type Parameters
نوع پارامترها معمولاً با حروف زیر نمایش داده میشوند:
*
*
*
*
مثلاً:
🔹 Wildcards (
در واقع Wildcards به ما اجازه میدهند با انواع نامشخص کار کنیم.
مثلاً:
اما در این حالت فقط میتوانیم بخوانیم، نه بنویسیم (به جز مقدار
🔹 تفاوت بین
*
🔸 نمیتوان در آن مقدار جدید اضافه کرد (بهجز
*
🔸 میتوان هر شیءای در آن قرار داد (String، Integer، و ...).
بنابراین
✅ جمعبندی
کلاس Generics در جاوا باعث میشود:
1. کد تمیزتر و امنتر باشد 🧩
2. از خطاهای زمان اجرا جلوگیری شود 💡
3. نیازی به Type Casting نباشد 🔒
در زبان Java، ویژگی Generics از نسخهی 5 معرفی شد تا بتوانیم نوع داده (Type) را بهصورت پارامتری تعریف کنیم. هدف اصلی Generics، افزایش ایمنی نوع (Type Safety) و حذف نیاز به Type Casting دستی است.
بهعنوان مثال:
List<String> names = new ArrayList<>();
names.add("Saleh");
String first = names.get(0); // نیازی به Cast نیست ✅
در نسخههای قدیمیتر:
List names = new ArrayList();
names.add("Saleh");
String first = (String) names.get(0); // نیاز به Cast ❌
🔹 Type Parameters
نوع پارامترها معمولاً با حروف زیر نمایش داده میشوند:
*
T → Type (نوع عمومی)*
E → Element (در Collectionها)*
K, V → Key و Value (در Mapها)*
? → Wildcard (نوع نامشخص)مثلاً:
class Box<T> {
private T value;
public void set(T value) { this.value = value; }
public T get() { return value; }
}🔹 Wildcards (
?)در واقع Wildcards به ما اجازه میدهند با انواع نامشخص کار کنیم.
مثلاً:
List<?> list = new ArrayList<String>();
اما در این حالت فقط میتوانیم بخوانیم، نه بنویسیم (به جز مقدار
null).🔹 تفاوت بین
List<?> و List<Object>*
List<?> یعنی لیستی از هر نوع (unknown type).🔸 نمیتوان در آن مقدار جدید اضافه کرد (بهجز
null).*
List<Object> یعنی لیستی که *حتماً* از نوع Object است.🔸 میتوان هر شیءای در آن قرار داد (String، Integer، و ...).
بنابراین
List<?> و List<Object> با هم یکسان نیستند.✅ جمعبندی
کلاس Generics در جاوا باعث میشود:
1. کد تمیزتر و امنتر باشد 🧩
2. از خطاهای زمان اجرا جلوگیری شود 💡
3. نیازی به Type Casting نباشد 🔒
#کاربرـپیشرفته
🆔 @javapro_ir
🆔 @group_javapro
👍7❤3
Please open Telegram to view this post
VIEW IN TELEGRAM
🎓موضوع: Bounded Generics در جاوا — محدودسازی نوع پارامترها با `extends` و `super`
در ادامهی مبحث Generics، حالا به یکی از ویژگیهای مهم آن میرسیم:
✅ مبحث Bounded Type Parameters
این ویژگی به ما اجازه میدهد نوع پارامتر Generic را محدود کنیم تا فقط از نوع خاصی (یا زیرکلاس آن) استفاده شود.
🔹 Upper Bound (`extends`)
وقتی از extends استفاده میکنیم، یعنی نوع پارامتر باید از یک کلاس خاص ارثبری کند یا یک اینترفیس خاص را پیادهسازی کرده باشد.
مثلاً:
✅ حالا فقط کلاسهایی مثل Integer, Double, Float و سایر زیرکلاسهای Number مجاز هستند:
🔹 Lower Bound (`super`)
وقتی از super در Wildcard استفاده میکنیم، یعنی نوع پارامتر باید ابرکلاس (Superclass) نوع مشخصشده باشد.
این روش معمولاً هنگام نوشتن دادهها در Collection بهکار میرود.
مثلاً:
اما هنگام خواندن از لیست، نوع بازگشتی فقط به صورت Object شناخته میشود.
🔹 نکته کاربردی: PECS اصل معروف در Generics
PECS = Producer Extends, Consumer Super
* اگر فقط از مجموعه میخوانی (Producer) ➤ از extends استفاده کن
* اگر فقط در مجموعه مینویسی (Consumer) ➤ از super استفاده کن
✅ جمعبندی
درواقع Bounded Generics به ما کمک میکند:
1. از نوعهای نامعتبر جلوگیری کنیم 🧩
2. انعطافپذیری و ایمنی نوعها را افزایش دهیم 🔒
3. کد قابلخواندنتر و قابلاعتمادتر بنویسیم 💡
در ادامهی مبحث Generics، حالا به یکی از ویژگیهای مهم آن میرسیم:
✅ مبحث Bounded Type Parameters
این ویژگی به ما اجازه میدهد نوع پارامتر Generic را محدود کنیم تا فقط از نوع خاصی (یا زیرکلاس آن) استفاده شود.
🔹 Upper Bound (`extends`)
وقتی از extends استفاده میکنیم، یعنی نوع پارامتر باید از یک کلاس خاص ارثبری کند یا یک اینترفیس خاص را پیادهسازی کرده باشد.
مثلاً:
class Box<T extends Number> {
private T value;
public void set(T value) { this.value = value; }
public T get() { return value; }
}
✅ حالا فقط کلاسهایی مثل Integer, Double, Float و سایر زیرکلاسهای Number مجاز هستند:
Box<Integer> intBox = new Box<>();
Box<Double> doubleBox = new Box<>();
// Box<String> stringBox ❌ خطا: String زیرکلاس Number نیست
🔹 Lower Bound (`super`)
وقتی از super در Wildcard استفاده میکنیم، یعنی نوع پارامتر باید ابرکلاس (Superclass) نوع مشخصشده باشد.
این روش معمولاً هنگام نوشتن دادهها در Collection بهکار میرود.
مثلاً:
List<? super Integer> list = new ArrayList<Number>();
list.add(10); // مجاز ✅
list.add(20); // مجاز ✅
اما هنگام خواندن از لیست، نوع بازگشتی فقط به صورت Object شناخته میشود.
🔹 نکته کاربردی: PECS اصل معروف در Generics
PECS = Producer Extends, Consumer Super
* اگر فقط از مجموعه میخوانی (Producer) ➤ از extends استفاده کن
* اگر فقط در مجموعه مینویسی (Consumer) ➤ از super استفاده کن
✅ جمعبندی
درواقع Bounded Generics به ما کمک میکند:
1. از نوعهای نامعتبر جلوگیری کنیم 🧩
2. انعطافپذیری و ایمنی نوعها را افزایش دهیم 🔒
3. کد قابلخواندنتر و قابلاعتمادتر بنویسیم 💡
#کاربرـپیشرفته
🆔 @javapro_ir
🆔 @group_javapro
👍5
