ورود

View Full Version : تعریف متد چندریختی در جاوا



saeedtrb
شنبه 31 خرداد 1393, 21:02 عصر
سلام دوستان چه طور میتونم یه همچین چیزی تعریف کنم؟؟

public void printItem(ArrayList <Menu> items)
public void printItem(ArrayList <Customer> items)

parvizwpf
شنبه 31 خرداد 1393, 22:14 عصر
خب الان تعریف کرده اید دیگه. بهش میگن method overloading. مشکلتون چیه؟

cups_of_java
شنبه 31 خرداد 1393, 23:24 عصر
سلام دوستان چه طور میتونم یه همچین چیزی تعریف کنم؟؟

public void printItem(ArrayList <Menu> items)
public void printItem(ArrayList <Customer> items)

نمی تونید همچین کاری بکنید و این از محدودیت های generics توی جاواست. به خاطر اینکه generics با استفاده از Type Erasure پیاده سازی شده توی جاوا، به این معنی که تمام اطلاعات مربوط به کلاس های generic در زمان کامپایل توسط کامپایلر حذف میشن و کد های غیر generics براشون تولید میشه (انگار مثل قبل از جاوا 5 خود برنامه نویس نوشته باشه اون کد ها رو) بنابراین کد بالا در زمان کامپایل به این تبدیل میشه:

publicvoidprintItem(ArrayList items)
publicvoidprintItem(ArrayList items)


که همونطور که می دونید این overloading آشتباهی هست و در زمان اجرا می تونه ابهام در فراخوانی متد ایجاد بشه.

vahid-p
یک شنبه 01 تیر 1393, 01:51 صبح
منظورتونه ما همه اینها رو جداگونه میتونیم داشته باشیم :

public void printItem(ArrayList<? extends String> list)
یا
public void printItem(ArrayList<String> list)
یا
public void printItem(ArrayList<E> list)


به این دلیل که در زمان کامپایل و حتی قبل از اون قابل تشخیصه چه آبجکتهایی میتونه قبول کنه و همون موقع چک میکنه آبجکتها همخونی دارن یا خیر و اررور میده، ولی زمان کامپایل برای آرگومانهاش محدودیتی نمیذاره ( نوع کلاس رو مشخص نمیکنه و شما میگید حذف میکنه ) و باید یکی بیشتر نباشه تا هنگام اجرا مطمئن باشه آبجکت مخصوصش فقط از اون استفاده میکنه و این درحالیه که دیگه کلاس داخل <> رو چک نمیکنه، درسته؟

پس اگر ما یک کلاس مثلا example1.class رو با یه متد
public void printItem(ArrayList<String> list)
داشته باشیم
و یه جا دیگه main.class و example1.class دیگه ای شامل :
public void printItem(ArrayList<Integer> list)
داشته باشیم، و جای دو کلاس example1.class رو عوض کنیم ( یعنی پس از کامپایل )، برنامه هنگام اجرا متوجه نمیشه چون آرگومان یکیه و ممکنه حتی درست عمل کنه!

cups_of_java
یک شنبه 01 تیر 1393, 12:53 عصر
برای اینکه generics رو توی جاوا طوری بتونن اضافه کنن که تمام کدهای قبلی و لایبرری استاندارد جاوا backward compatible باشه بی دردسر ترین راه و ممکن ترینش همین بود که اصلن در زمان اجرا runtime جاوا چیزی به نام generics نداشته باشه. کامپایلر در زمان کامپایل میاد تمام اون <> رو برمیداره و به کدهای معمولی تبدیل میکنه و فقط چک های instaceof و castهای مربوطه که خود برنامه نویس باید قبل جاوا 5 میذاشت رو میزاره و خب طبیعتن کد safeی درست میکنه و کامپایل میکنه... بنابراین چیزی به نام ArrayList<String> اصلن وجود نداره در زمان اجرا! فقط ArrayList داریم.

parvizwpf
یک شنبه 01 تیر 1393, 15:31 عصر
http://stackoverflow.com/questions/2241514/overloading-java-function-with-list-parameter

cups_of_java
یک شنبه 01 تیر 1393, 20:30 عصر
لینکی که دوستمون دادن یک راه حل این مشکل با استفاده از پلی مورفیزم هستش.
راه های دیگه ای مثل استفاده از الگوی visitor که البته حجیم تره هم می تونه استفاده بشه...

saeedtrb
سه شنبه 03 تیر 1393, 22:38 عصر
ممنون از لطفتون دوستان راستش این اولین برنامه ای هست که می خوام به امید خدا با جاوا بنیسم البته تکمیل شده ولی تمایل دارم این قسمت برنامه رو با این نوع متدها پیاده کنم. استادمون در مورد متدهای چند ریختی یه مقدار توضیح داده و گفته کامپایلر جاوا خودش چک می کنه نوع متدهای همنام رو و ورودی ها رو به متدی که با مقدار ورودیمون یکی می ده و من هم تو جستجو هام چند نمونه ای دیدم اما به دلیل پایین بودن معلوماتم در مورد جاوا نتونستم پیاده سازی بکنم. حالا یعنی کلاً ما نمی تونیم همچین ساختاری پیاده کنیم؟ ممنون می شم یه توضیح مختصر و مفید هم در مورد متد های چندریختی بدید

cups_of_java
چهارشنبه 04 تیر 1393, 10:05 صبح
http://barnamenevis.org/showthread.php?318258-%D9%81%DB%8C%D9%84%D9%85-%D8%A2%D9%85%D9%88%D8%B2%D8%B4%DB%8C-%D8%A7%DB%8C%D9%86%D8%AA%D8%B1%D9%81%DB%8C%D8%B3-%D9%87%D8%A7-%D8%AF%D8%B1-%D9%85%D9%81%D9%87%D9%88%D9%85-%DA%86%D9%86%D8%AF%D8%B1%DB%8C%D8%AE%D8%AA%DB%8C-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C&highlight=%DA%86%D9%86%D8%AF%D8%B1%DB%8C%D8%AE%D8% AA%DB%8C