Generics در Java
هنگام ساختن لیست، نوع عنصر را داخل کروشهای زاویهای مشخص کنید. در Bin.java کلاس عمومی Bin را نگه دارید، import java.util.ArrayList; را اضافه کنید، ArrayList<String> names = new ArrayList<>(); بسازید، "oak" را اضافه کنید، و names.get(0) را چاپ کنید. با javac Bin.java ترجمه کنید و java Bin را اجرا کنید. صفحه باید oak را نشان دهد. دموی دوم همان روش را با مقدار Integer برابر 3 نگه میدارد. Lambda اختیاری را برای صفحهٔ بعد بگذارید. این درس لیستهای تایپشده با Generics است، نه آرگومانهای خط فرمان args و نه پروژهٔ کوچک Scanner.
لیست String با type argument
Bin.java را باز کنید. نام کلاس عمومی را Bin نگه دارید. دموهای باقیماندهٔ Program Arguments با Flag، پرسوجوهای باقیماندهٔ Scanner در Box، چاپهای کامپایل باقیماندهٔ Build، و تاریخچهٔ جمعآوری باقیماندهٔ Shelf را پاک کنید اگر داستان Generics را میپوشانند. برنامه نباید منتظر تایپ شما بماند و نباید args را بخواند.
import را بالای فایل بگذارید:
import java.util.ArrayList;
داخل Bin.main لیستی بسازید که عناصرش String باشند:
ArrayList<String> names = new ArrayList<>();
کروشهای زاویهای بعد از ArrayList نوع عنصر را نگه میدارند — اینجا String. <> خالی سمت new همان diamond است — Java همان نوع را از سمت چپ پر میکند. بعد یک کلمه ذخیره کنید و با اندیس چاپش کنید:
names.add("oak");
System.out.println(names.get(0));
get(0) یک String برمیگرداند چون لیست با String اعلان شده است. صفحه oak را نشان میدهد.
import java.util.ArrayList;
public class Bin {
public static void main(String[] args) {
ArrayList<String> names = new ArrayList<>();
names.add("oak");
System.out.println(names.get(0));
}
}
از پوشهای که Bin.java در آن است javac Bin.java را اجرا کنید. وقتی آکولاد، کروش و نقطهویرگول درست باشند، javac خط جداگانهای چاپ نمیکند. بعد java Bin را بزنید — نه java Bin.java. یک کلاس عمومی نگه دارید تا نام با Bin یکی بماند.
یکبار مسیر اجرا را دنبال کنید. Java از Bin.main شروع میکند. لیست برای String تایپ شده است. add مقدار "oak" را ذخیره میکند. get(0) همان کلمه را برمیگرداند. println مینویسد oak. جایی args[0] از Flag چاپ نمیشود. جایی در item: منتظر نمیماند. جایی [oak, pine] چاپ نمیشود مگر هنوز فایل قدیمی Shelf را اجرا کنید.
همزمان با نگاه به صفحه قانون مبتدی را بگویید: کروش زاویهای نوع عنصر را نام میبرد؛ diamond همان نوع را در new تکرار میکند؛ get همان نوع را برمیگرداند. دموهای Lambda را روی این صفحه نسازید. Lambda تا درس اختیاری بعدی منتظر است. لیست را raw به شکل ArrayList names بدون type argument در این فایل آموزشی نگه ندارید.
اگر هنوز oak را از java Flag oak میبینید، آن Program Arguments بود. اینجا oak عنصر لیست است و فرمان اجرا فقط java Bin است. اگر javac ArrayList را پیدا نمیکند، خط import را چک کنید.
لیست Integer با همان عادت
Generics فقط برای کلمات نیست. همان کلاس عمومی Bin را نگه دارید. لیستی از مقادیر Integer بسازید:
ArrayList<Integer> nums = new ArrayList<>();
nums.add(3);
System.out.println(nums.get(0));
دوباره با javac Bin.java ترجمه کنید و java Bin را اجرا کنید. صفحه 3 را نشان میدهد. type argument اینجا Integer است چون ArrayList اشیاء نگه میدارد و Integer شکل شیء برای اعداد صحیح در این سطح مبتدی است. diamond باز هم نوع را از سمت چپ کپی میکند.
import java.util.ArrayList;
public class Bin {
public static void main(String[] args) {
ArrayList<Integer> nums = new ArrayList<>();
nums.add(3);
System.out.println(nums.get(0));
}
}
یکبار مسیر اجرا را دنبال کنید. لیست برای Integer تایپ شده است. add(3) مقدار را ذخیره میکند. get(0) آن را برمیگرداند. println مینویسد 3. دو دمو را دو شکل آموزشی نگه دارید. اول لیست String را ثابت کنید. بعد لیست Integer را ثابت کنید. هر دو شکل import، diamond، add، و get(0) را مشترک دارند.
اگر ArrayList<String> بنویسید و بعد add(3) بزنید، javac ناهماهنگی را رد میکند. اگر ArrayList<Integer> بنویسید و بعد add("oak") بزنید، javac آن ناهماهنگی را هم رد میکند. type argument قراردادِ آن است که لیست چه چیزی نگه میدارد.
عادتهای لیست تایپشده
هنگام تمرین type argument و diamond را با هم نگه دارید.
📊 عادتهای Generics برای Bin
| عادت | شکل تایپشده | چک مبتدی |
|---|---|---|
| اعلان | ArrayList<String> names |
کروش زاویهای نوع عنصر را نام میبرد |
| ساخت | new ArrayList<>() |
diamond نوع را از چپ کپی میکند |
| ذخیرهٔ String | names.add("oak") |
مقدار با String همخوان است |
| ذخیرهٔ Integer | nums.add(3) |
مقدار با Integer همخوان است |
| خواندن | get(0) |
نوع عنصر اعلانشده را برمیگرداند |
Generics نه Flag است و نه Lambda
Program Arguments آرایهٔ String[] args را از خط راهاندازی پر میکرد. Generics نوع عنصر مجموعهای را که در کد میسازید نام میبرد. Lambda بعداً بعضی شکلهای فراخوانی را کوتاه میکند — در صفحهٔ اختیاری بعدی. امروز آن سه کار را در یک فایل مبتدی قاطی نکنید.
oak در Bin مقدار ذخیرهشده در لیست است. oak بعد از java Flag یک آرگومان بود. همان املاء، کار متفاوت. وقتی فایل باقیماندهٔ Flag هنوز کلمه روی خط فرمان میخواهد، آن را تاریخ بگذارید و java Bin را بدون کلمهٔ اضافه اجرا کنید.
بدون type argument، لیست raw قرارداد روشنی را که این صفحه میآموزد از دست میدهد. در دموهایی که نگه میدارید ArrayList<String> یا ArrayList<Integer> را نگه دارید. سینتکس Lambda را تا آن درس از این صفحه دور نگه دارید.
چک پوشه قبل از Lambda
بعد از ترجمهٔ موفق پوشه را لیست کنید. باید Bin.java و Bin.class را با هم ببینید. منبع را ویرایش کنید، ذخیره کنید، javac Bin.java را بزنید، بعد java Bin را اجرا کنید. .class کهنه اگر بعد از ویرایش ترجمه را رد کنید ممکن است چاپ قدیمی نشان دهد.
اگر javac از کلاس عمومی تکراری شکایت کرد، فقط Bin را public نگه دارید. اگر صفحه [oak] بهجای oak نشان داد، کل لیست را چاپ کردهاید نه get(0) — چاپ آموزشی را get(0) نگه دارید. اگر چیزی چاپ نشد، تأیید کنید main هنوز println را صدا میزند.
حلقهٔ آرگومان Flag را در Bin نچسبانید. پرسوجوهای Scanner از Box را در Bin نچسبانید. کار اختیاری Generics همان لیستهای تایپشده با نوع عنصر روشن است.
قبل از Lambda اختیاری
میتوانید کلاس عمومی Bin را نگه دارید، ArrayList را import کنید، ArrayList<String> با diamond بسازید، "oak" را اضافه کنید، get(0) را بهصورت oak چاپ کنید، بعد ArrayList<Integer> بسازید، 3 را اضافه کنید، و 3 چاپ کنید. با javac Bin.java ترجمه کنید و java Bin را اجرا کنید. جدول اعلان، ساخت، ذخیره و خواندن را جدا میکند. صفحهٔ اختیاری بعدی Lambda است.
دموهای Bin را برای جفت روشن Generics نگه دارید. هنگام تمرین لیست تایپشده فایلهای Program Arguments با Flag را از این صفحه دور نگه دارید. هنگام تمرین لیست تایپشده فایلهای Mini Project با Box را از این صفحه دور نگه دارید. کار Lambda را تا آن درس از این صفحه دور نگه دارید. آن عادتها ایستگاه کنترل قبل از ادامه است. وقتی دموی String صفحه oak یا دموی Integer صفحه 3 را نشان دهد، Generics کار این درس را کرده و اگر مسیر اختیاری را ادامه دهید برای Lambda آمادهاید.
یک پاس آخر روی پوشه: یک Bin عمومی، import حاضر، type argument داخل کروش زاویهای، diamond روی new، مقادیر add همخوان، چاپ get(0)، بدون انتظار Scanner، بدون کلمه روی خط راهاندازی. یکبار دیگر روی دموی باز javac Bin.java و java Bin را اجرا کنید. اگر صفحه هنوز oak یا 3 را نشان دهد، شکل Generics محکم است و کورس میتواند به Lambda اختیاری در صفحهٔ بعد برود. در هر خواندن یک عادت روشن لیست تایپشده نگه دارید تا هر پاس همان نقشه را بیاموزد.
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود