Telegram Web
🎓 موضوع: Generics در جاوا — حذف 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
👍73
💻دوره جامع نخبگان معماری میکروسرویس ها با Java و Spring Boot بروزرسانی شد

فصل ۲۱ به دوره اضاف شد
📅تاریخ آخرین بروزرسانی:  ۱ آبان ۱۴٠۴

🔺مشاهده


🧮امکان تهیه دوره میکروسرویس طی ۴ قسط برای مدت محدود، جهت خرید به صورت اقساط به آی دی زیر پیام بدید👇
@rzutab
Please open Telegram to view this post
VIEW IN TELEGRAM
🎓موضوع: Bounded Generics در جاوا — محدودسازی نوع پارامترها با `extends` و `super`

در ادامه‌ی مبحث 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
2025/10/25 18:09:06
Back to Top
HTML Embed Code: