Generic Method
توضیحات جلسه
جزوه و مستندات
مفاهیم کلیدی
- Generic Method
متدی است که Type Parameter مخصوص به خود را تعریف میکند. این متدها مستقل از کلاس هستند؛ یعنی حتی اگر کلاس جنریک نباشد، متد میتواند بهصورت جنریک تعریف شود.
- Type Parameter
یک جایگزین برای نوع داده، مانند T، است که هنگام تعریف متد مشخص میشود. این پارامتر قبل از نوع بازگشتی متد و داخل Diamond Operator قرار میگیرد و به متد اجازه میدهد با انواع مختلف داده کار کند.
- Diamond Operator
علامت <> است که برای تعریف پارامترهای نوع استفاده میشود. در متدهای جنریک، این علامت دقیقاً قبل از نوع خروجی یا Return Type قرار میگیرد.
- Type Inference
قابلیتی در جاوا است که به کامپایلر اجازه میدهد بر اساس آرگومانهای ورودی متد، نوع داده T را بهصورت خودکار تشخیص دهد. بنابراین هنگام فراخوانی متد، معمولاً نیازی به مشخص کردن صریح نوع نیست.
- ClassCastException
خطایی است که در زمان اجرای برنامه یا Runtime رخ میدهد؛ زمانی که تلاش میکنیم یک شیء را به نوعی تبدیل کنیم که با آن سازگار نیست. استفاده از جنریکها با فراهم کردن کنترل در زمان کامپایل، از بروز این خطا جلوگیری میکند.
موارد مصاحبه ای
- تفاوت Generic Method با Generic Class در چیست؟
در Generic Class، پارامتر نوع برای کل کلاس تعریف میشود و میتواند روی فیلدها، سازندهها و متدها اثر بگذارد. اما در Generic Method، پارامتر نوع فقط مخصوص همان متد است و اثری بر سایر بخشهای کلاس ندارد.
- آیا یک کلاس غیر جنریک میتواند متد جنریک داشته باشد؟
بله. متدهای جنریک مستقل از کلاس هستند. شما میتوانید در یک کلاس معمولی، متدی تعریف کنید که Type Parameter مخصوص به خود را داشته باشد.
- محل قرارگیری پارامتر نوع در ساختار متد کجاست؟
پارامتر نوع، مانند <T>، باید دقیقاً قبل از نوع بازگشتی متد قرار بگیرد؛ مانند void، String یا خود T.
- مزیت اصلی استفاده از Generic Method چیست؟
مزیت اصلی آن افزایش قابلیت بازاستفاده یا Reusability کد و امنیت تایپی یا Type Safety است. با این روش، یک متد میتواند انواع مختلف داده را بپذیرد؛ بدون اینکه به Casting دستی نیاز باشد یا نگرانی بابت خطای ClassCastException وجود داشته باشد.
سناریو کاربردی
در این آموزش، دو سناریوی اصلی برای درک بهتر متدهای جنریک بررسی شده است:
۱. متد چاپگر عمومی
ابتدا متدی به نام print طراحی میشود که فقط مقدارهای رشتهای از نوع String را میپذیرد. برای اینکه این متد بتواند هر نوع دادهای، مانند Integer یا اشیای سفارشی مثل Person، را چاپ کند، آن را جنریک میکنیم.
با قرار دادن <T> قبل از void و تغییر نوع ورودی به T، متد میتواند هر ورودی سازگار را بدون مشکل بپذیرد و نمایش دهد.
۲. متد دریافت اولین آیتم آرایه
این متد که getFirst نام دارد، یک آرایه از نوع T[] دریافت میکند و اولین عنصر آن را برمیگرداند. نکته مهم این است که خروجی متد نیز از نوع T تعریف میشود.
به این ترتیب، اگر آرایهای از رشتهها به متد بدهیم، خروجی بهصورت خودکار از نوع String خواهد بود. اگر آرایهای از اشیای Person بدهیم، کامپایلر تشخیص میدهد که خروجی از نوع Person است. این رفتار نشاندهنده قدرت تشخیص خودکار نوع یا Type Inference در جاوا است.
بیشتر بدانید
- انعطافپذیری در خروجی و ورودی
در متدهای جنریک، الزامی نیست که هم ورودی و هم خروجی از نوع جنریک باشند. بسته به نیاز برنامه، ممکن است فقط ورودی جنریک باشد، فقط خروجی جنریک باشد، یا هر دو جنریک باشند.
- استقلال از Static بودن
مستقل بودن متد جنریک از کلاس به معنای static بودن آن نیست. منظور این است که تعریف Type Parameter در متد، وابسته به جنریک بودن یا نبودن خود کلاس نیست.
