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، پارامتر نوع فقط مخصوص همان متد است و تاثیری بر سایر بخشهای کلاس ندارد.
-
آیا یک کلاس غیر جنریک میتواند متد جنریک داشته باشد؟ بله، متدهای جنریک مستقل از کلاس هستند. شما میتوانید در یک کلاس معمولی، متدی تعریف کنید که پارامتر نوع خود را داشته باشد.
-
محل قرارگیری پارامتر نوع در ساختار متد کجاست؟ پارامتر نوع (مثلاً
<T>) باید دقیقاً قبل از نوع بازگشتی متد (مانندvoidیاStringیا خودT) قرار بگیرد. -
مزیت اصلی استفاده از Generic Method چیست؟ افزایش قابلیت بازاستفاده (Reusability) کد و امنیت تایپی (Type Safety). با این روش، یک متد میتواند انواع مختلف داده را بپذیرد بدون اینکه نیاز به Casting دستی یا نگرانی بابت خطای
ClassCastExceptionباشد.
سناریو کاربردی
در این آموزش، دو سناریوی اصلی برای درک بهتر متدهای جنریک بررسی شده است:
۱. متد چاپگر عمومی (print):
ابتدا متدی طراحی میشود که فقط رشته (String) میپذیرد. برای اینکه این متد بتواند هر نوع دادهای (مانند Integer یا اشیاء شخصیسازی شده مثل Person) را چاپ کند، آن را جنریک میکنیم. با قرار دادن <T> قبل از void و تغییر نوع ورودی به T، متد قادر خواهد بود هر ورودی را بدون مشکل بپذیرد و نمایش دهد.
۲. متد دریافت اولین آیتم آرایه (getFirst):
این متد یک آرایه از نوع T[] دریافت کرده و اولین عنصر آن را برمیگرداند. نکته مهم در اینجا این است که خروجی متد نیز از نوع T تعریف میشود. به این ترتیب، اگر آرایهای از رشتهها به متد بدهیم، خروجی به صورت خودکار String خواهد بود و اگر آرایهای از اشیاء Person بدهیم، کامپایلر تشخیص میدهد که خروجی از نوع Person است. این موضوع نشاندهنده قدرت تشخیص خودکار نوع (Inference) توسط جاوا است.
بیشتر بدانید
-
انعطافپذیری در خروجی و ورودی در متدهای جنریک، الزامی نیست که هم ورودی و هم خروجی از نوع جنریک باشند. بسته به نیاز برنامه، ممکن است فقط ورودی جنریک باشد، یا فقط خروجی، و یا هر دو.
-
استقلال از Static بودن مستقل بودن متد جنریک از کلاس به معنای استاتیک بودن آن نیست، بلکه به این معناست که تعریف تایپ پارامتر متد، وابستگی به جنریک بودن یا نبودن خودِ کلاس ندارد.
