Amir_B
Amir_B
خواندن ۲۶ دقیقه·۳ سال پیش

جلسه شانزدهم جنریک ها، ioc4

میخوایم در مورد جنریک ها صحبت تکنیم اول بیایم مشکلاتش رو بررسی کنیم که ببینیم چه مشکلاتی وجود داره و بعد از اینکه کامل و دقیق فهمیدیم مشکلش رو اون موقع شروع میکنیم به راه حلش رو به دست آوردن .

خب مشکلاتی که داریم کجا ها هستند ؟

اول مشکلاتی که داره رو با هم بررسی کنیم قبلا یه چیزی داشتیم به اسم شیپ ارری لیست

و یه استودنت ارری لیست رو هم داشتیم که اینجا من اسمش رو ععوض کردم به رازی ارری لیست .

خب مشکلاتش رو با هم بررسی کنیم اولین مشکلی که استودونت ارری لیست داره چیه ؟ شما به من بگین میخوام با هم دیگه بررسیش کنیم .

جواب: مخصوص دانشجو هستش مهم ترین مشکلش اینه که الان این استودنت ارری لیسته وابسته است بخاطر همین من مجبورم وقتی میخوام برای دایره هام ارری لیست تعریف کنم مجبورم از اول دوباره همه چی رو بنویسم الان برای دایره ها همه چی نوشتم ولی شیپ رو اینجا استفادفه مکینم

خب مشکل ارری لیست وابستگی به نوع داده اشه . اصلا چرا اسمش رو گذاشتیم ارری لیست ؟ بخاطر اینکه یه ارری لیسته یه ارایه پویاست برای دانشجو ها .

این یکی شیپ ارری لیسته چرا اسمش شیپه ؟ چون یه ارایه پویاست که فقط شیپ ها رو میپذیره

ورودی این کلاسمان کجاست

چه استودنت ارری لیست چه شیپ ارری لیست
وروردی اصلیش کدامه ؟ سازنده که نیست سازنده فقط سایز میگیره متد ادد هستش خیلی راحت .

ستر هم براش نذاشته ادد گذاشته متد ادد ورودیمه من داده اصلیم استتودنته و ورودی سازنده استودنت نیست فقط یه عدد صحیحه

و ورودی اصللیم این جاییه که استودنت میاد داخل و من بررسی میکنم که آیا جا داره این آرایه ام یا ن اگه نداره که رشدش بده اگهگ داره که هیچی دست نزن بهش همون یه دونه کانتر پیش روی میکنه و اون یه دونه کانتر رو اضافه کن

این متد رشدشه این متد ریموششه که اندیس میگیره حذف میکنه و متد گتش هم ورودی استودنت نداره ورودی یه عدد میگیره و خروجی یه استودونت داره جای دیگه هم من ورودی ندارم پس همین یه جا من وروردی دارم همین یه جا دارم ورودی میگیرم و نوع داده ای هم که دارم استفاده میکنم استودنته

پس این کلالس استودنت ارری لستم وابسته است به نوع داده استودنت من اگه بخوام توتسعه اش بدم برای چیز های دیگه باید کدش رو کلن کپی کنم بیارم داخل شیپ ارریلیست پیست کنم و اسم استودنت ها رو به شیپ تغییر بدم .

به این صورت : و ورودیم رو هم شیپ بذارم . و حالا چیز های مختلف دگیه جا های دیگه هم برای داده های دگیه باز هم همین کار ها رو باید انجاما بدم فایل بسازم کپی کنم همه چیز هاش رو باید ببرم اون ور ولی خب این اصول ما رو داره نقض میکنه اما هدف ما اینطوری نبود هدف ما این بود که بتونیم از ابزار هامون مخصوصا در حالت کلی کد هامون بتونیم استفاده مجدد کنیم قابل تتوسعه باشه اما به طور خاص و ویژه میشه ابزار هایی که برای کلاس های دیگه می سازیم . مثل مثلا ارری لیست مثل مرتب سازی مثل خیلی چیز های مختلف دیگه که بر روی داده های اولیه مون کار میکنن داده های اصلیمون مثلا مثل استودنت سیرکل و .. . و هرچی

هدفمون این بود که عمومی باشن که بتونیم استفاده کنیم ن همینجا تو خیلی از برنامه های دیگه هم که بعد ها میتونیم بسازیم

شاید مثللا فرض کن تو اگه الان بیای مثلا یه کد رو خیلی مهندسی شده بنویسی و بخوای اصول رو توش رعایت کنی شاید مثللا یه هفته ازت وقت بگیره برای بار اولش حالا دارم مثلا میزنم . اما تو تفرض کن دو هفته وقت گذاشتی و اون کد رو نوشتی حالا فرض کن ده تا پروزه دیگه هم میایی می سازی و تولید میکنی و از این ده تا پروژه ات باز به اون کده نیاز داری دیگه اصلا نیازی نیست دوباره این کارا رو تکرار کنی و انجامشون بدی و اینکه بخواد دو هفته وقت بگیره

سریع میای کتابخونه ادد میکنی و استفاده میکنی اما فرض کن مهندسی انجامش ندی برای ده تا پروژه ات باید ده تا یک هفته ای وقت میذاشتی دو هفته کجا و ده هفته کجا پس کلن صرفه جوییه دیگه پس الان میخوایم یه جوری توسعه اش بدیم چون الان وابسته است به استودنت

خب این یه دونه مشکل

کدی که من نوشتم وابسته شده به نوع داده ام

دو تا مشکل دیگه هم توی این دو تا مدل سازی ای هست که انجام دادم

اول کامپیربلش رو بهتون میگم بعدش میریم کمپریتورش رو هم بهتون میگم مشکل کمپریبلمون چیه مگه ما نگفتیم که اینترفیس گذاشتیم خیلی عالیه عمومیش کردیم الان همه چی برای ما مرتب میکنه پس چرا دوباره اومدیم و دنبال ایراد میگردیم توش ؟!

به نظرتون مشکلش کجاست ؟

اون پارامترش رو که گفتیم و بعد با کامپریتور حلش کردیم به غیر از این مشکل که با کمپریتور حلش کردیم یه مشکل دیگه هم داره به نظرتون مشکلش چیه ؟ مربوط به همین عمومی بودنشه ها مربوط به همین عمومی بودنشه مشکلش اینه که فرض کنید اینجا

فرض کنید که ارایه ای از کمپپریبل ها نوشتم مثلا گفتم ده تا ایتم میگیره و بعد تو خانه اوش استودنت گذاشتم و توی خونه دومش سیرکل گذاشتم بعدش میام به لیست یوتیلیتی میگم

میگم بیا سورت کن ایتمز و میبینیم که هیچ اروری نداد چون هیچ اروری نداده الان اشتباههه یعنی در واقع یعنی الان نباید قبول میکرد اصن چرا نباید از من قبول کنه درسته که من عمومیش کردم هااا من الان عمومیش کردم که همه چی رو بگیره

قبلا وابتسه بود استودنت گذاشته بودیم نمیدونم شیپ گذاشته بودیم گفتیم این الان خوب نیست خیلی وابسته است گفتیم که از اینترفیس استفاده میکنیم برای اینکه هرچیزی بتونیم بهش بدیم اما این کمپریبل رو هم که گذاشتم خیلی عمومیش کرده

چون که استودنت نباید با دایره مقایسه اش کرد من نمیتونم این رو با سیرکل مقایسه کنم بر اساس چه پارامتری بخوام مقایسه اش کنم ! ؟ یکی اوریج داره دیگری شعاع داره مساحت داره

من الان هر دو رو میتونم بذارم داخل کمپریبل و ایتمز رو حالا امده تعریف کردم و گفتم سورت کن و این میاد سعی کنه که سورتت کنه

الان دو تا ایتم توشه صفرش استودنته و یکش سیرکله و اینجا میگه استودنته مقایسه شو با سیرکل .

میاد داخل متد استودنت متد کمپیرش که حالا اینجا هست میاد توی متد کمپیرش و اینجا گفته که چیکارش کنیم ؟ گت اوریج بیا مقایسه کن با چی ؟ این رو باید کستش میکردیم و گت اوریج

خب گفتم چیه ؟ گفتم استودنت خونه اولش استودنته و دومی سیرکله

حالا این گفتم چیه گفت خونه اولش استودنت و دومی سیرکله میگه استودنت دات کمپیر سیرکل

میاد اینجا خب الان یه سیرکل اومده اینجا بعد سیرکل رو کست کن به استودنت و گت اوریج و بعد بهم ارور میده ارور زمان اجرا

میده خب این اشتباهه اصلا نباید بپذیره یه همچین چیزی ن اینکه نباید بپذیره همچین قابلیتی رو داشته باشه اما شاید اصلا بخوام کد هایی از نوع های مختلف رو با هم مقایسه کنم شاید بخوام این کار رو هم انجام بدم مثلا فرض کن

مثلا فرض کن چندین داده مختلف رو با هم داده هایی که ای دی دارن مثلا همه داده هایی که ایدی دارن مثلا برای استودنت ایدی بزارم برای چیز های دیگه هم ایدی میزارم بعد بتونم خودم بهش بگم بگم مثللا این سیرکله بر اساس ای دی بر اساس کلاس مشترکی بین کلاس های دگیه قابل مقایسه است مثلا فرض کن بگم بر اساس ایندکسبل کلاس هایی که قابل ایندکس شدن هستن .

یه اینترفیس تعریف کنم و بعد بگم سیرکل ایندکس بله بعد بگم مثلا میتونه ایندکس داشته باشه استودنت ایندکس بله میتوته ایندکس داشته باشه بعد مثلا بگم سیرکلم بر اساس ایندکسه قابل مقایهس است خودم بگم بر اساس چی بر اساس ایندکسبل بودن قابل مقایسه است پس بگم استودنتمم بر اساس ایندکسبل بودن میتونن با هم قابل مقایسه باشن . این قابلیت باشه اما اگر من خواستم فقط و فقط نوع داده خاصی رو برای من مرتب کنه ن اینکه لیستی از همه چیز رو یعنی هم اون باشه هم این باشه این نباشه که داده های مختلف با پارامتر های مختلف با هم قابل مقایسه باشن . چطوری با هم قابل مقایسه باشن ؟! نمیتونم همچین چیزی وجود نداره اما اگر یه پارامتر مشترکی اومدم و بینشون تعریف کردم و اومدم یه اینترفیس براشون گذاشتم و همشون بر اساس این پارامتر قابل مقایسه ان اون اره اون میشه ولی این نباشه که هر کدوم بر اساس یه پارامتر برای خودشون قابل مقایسه باشن و بعد استودنت رو با سیرکل بخوام مقایسه کنم چطوری میشه نمیشه همچین چیزی در واقع داده های مختلفمون تو دنیای واقعی به صورت جزئی قابل مقایسه اند .

یعنی چی جزئی تو ریاضیات گسسته اگه داشته باشین یه چیزی به اسم ترتیب جزئی هست که به صورت جزئی اینا میتونستن ترتیب داشته باشن اینم همینه به صورت جزئی میتونن قابل مقایسه باشن یعنی لیوان رو با لیوان مقایسه کنن موس رو با موس مقایسه کنند انسان رو با انسان مقایسه کنند یا اگر خواستم پارامتر مشترکی بینشون بذارم بتونم همشون رو بر اساس اون پارامتر مشترک مقایسه کنم پس باید به طور خیلی مشخص خودم بگم که بر اساس چی مقایسه پذیر باشه ن اینکه همین طوری بگم مقایسه پذیر باشه !خب بر اساس چی مقایسه پذیر باشه ؟؟! این یه مشکل دیگه که الان با جزییات بیشتر برسیش میکنیم یکی هم توی این کمپریتورمه خب کاملا مشخصه دیگه این کمپریتور مشکلش چیه ؟

این دیگه کاملا مشخصه وابسته است به استودنت هم اینجا خود این وابسته است به استودنت هم کامپریتورش وابسته است به استودنت کمپریتوری هم که تعریف کردم وابسته است به استودنت پس این کاملا مشخصه هم خودش وابسته است خود این متدم وابسته است و هم

و هم کمپریتوتری که دارم در داخلش استفاده میکنم وابسته است پس این سه تا مشکل رو ما میخوایم حلشون کنیم . چطوری باید حلشون کنیم ؟ با استفاده از سطح چهارم اول ارری لیسته رو بیایم درستش کنیم خب تا اینجای کار تمام مطالبی که در مورد دپندنسی اینجکشن داشتیم و اینورژن اف کنترل داشتیم و حذف وابستگی و وابسته کردن به نوع داده عمومی تر و اینترفیس ها و همه این چیز هایی که داشتیم یه چیز مشترک بینشون وجود داشت دپندنسی اینجکشنشون صدرصد یک نمونه از نوع داده رو میپذیرفت یعنی چی یک نمونه از نوع داده رو می پذیرفت >> مثلا

مثلال توی این سورت کمپیربلی که اینجا نوشتتیم چی رو از ما میپذیره ؟ لیستی از کمپیربل ها رو از ما میپذیره یعنی لیستی از متغیر های ادرس حافظه یعنی متغیری که تعریف شده میپذیره

اینجا مثل این آیتمز الان من ایتمز رو تعریف کردم این ها همشون متغیر های ادرس حافظه ان دو تاش نمونه سازی واقعی شده بقیه شون متغیر ادرس حافظه ان ولی تعریف شدن اون جمله قبلیم رو اصلاح کنم بهتره اینطوری باید بگم : تا اینجای کار هرچی که داشتیم دپندنسی اینجکشنشون یک متغیر تعریف شده رو میپذیرفتند حالا یا اون متغیر ادرس حافظه بود یا اینکه مثلا یک نمونه داخلشه

هرچند خالی بنویسی هم ارور میده باید حتما نوع رو هم توش ریخته باشی که برات بتونه اون کار رو انجام بده یعنی نال باشه باز ازت قبولش نمیکنه و بهت ارور میده


یا مثلا توی استودنت ارری لیستی که اینجا داریم

چی رو فرستادم داخل؟ با نیو یه نمونه ازش ساختم و فرستادم تو متد ادد ممکن بود این رو توی یه متغیری قرار میدادم به هر حال باید یه نمونه ازش تعریف کنم و اون رو بفرستم تو که بیاد داخل استودنت ارری لیستم و اون رو بفرستم تو که بیاد داخل استودنت ارری لیستم

اینجا برام بذاره داخل اون لیسته همه اون سطوح مختلف همه شون اونطوری بودن همه سطوح از یک و دو سه و همه شان نمونه رو میپذیرفتند مشکلی که من اینجا در استدونت ارری لیست دارم با فقط نمونه فرستادن داخل درست نیشه مشکلم نوع داده است

چقدر خوبه که من بتونم نوع داده ام رو بفرستم تو و بتونم

و بتونم بگم از این استفده کنه یعنی چی یعنی بگم مثلا مثل این هست که الان گفتم ادد مثلا یه چیزی

این الان خود استودنت رو فرستادم تو اگر نوعش رو بخوام بفرستم تو باید اینجوری می نوشتم

این نوع داده شه دیگه متغیر تعریف نکردیم نوع داده استودنته اون نقشه اس اون الگوئه اس اون الگلو رو باید بفرستم تو ن اینکه یه نمونه از الگور رو بفرستم تو مثل این میمونه مثلا یکی نقشه رو میکشه نقشه یه ساختمون میده دست افراد مختلف مثلا میده دست یه نفر یا مثلا نقش یه ماشین مثلا توی کارخانه میدم دست اون مهندس ها نقشه رو الگو رو مدل رو میگن از رو این ماشین بسازین خب یه دونه میسازن دو تا میسازن بعد ممکنه به خط های تولید مختلف این رو بدن مثلا بگن این نمونه برای تو این یکی هم برای تو این الگو برا تو و این الگلو هم برای تو یه دونه ماشین رو بهتون نمیدن که بهتون بگن از روشون یکی رو بساز

میگن این مدله این الگوته این مدل رو از روش بساز همون رو ممکنه بدن به یکی دیگه بگن این الگو و مدلته بگن از روش بساز پس ممکنه الگو رو بفرستن جا های مختلف که نمونه های مختلف رو ازش بسازن این هم الان همینه من الان نیاز دارم خود الگوم رو داخل لاستودنت ارری للیست و بهش بگم تو از ........... برای خودت متغیر تعریف کن از روی این الگو از روی این مدل بیا متغیر تعریف کن داخل یا ممکنه بفرستم برای لییست یوتیلیتی بفرستم برای نمیدونم هر کلاس دیگه ای بگم بر اساس این الگو بیا این کار رو انجام بده متغیر تعریف کن .

کجا قبلا ازش دیده بودیم ؟داخل خود ارری لیست جاوا

ما مینوشتیم ارری لیست وقتی این رو مینوشتیم جلوش یه علامت باز میکردیم که بهش میگن دایموند

بعد اینجا چی مینوشتم میومدم مینوشتم نیو استدونت همچین چیزی نمی نوشتم این الان یه نمونه است من خود الگو رو مینوشتم یعنی دقیقا خود اون مدل ام رو می نوشتم نمونه ای ازش ننوتشم

این اشتباه ست که استودنت بسازی بعد اسمش رو داخل دایموند بزاری این بهت ارور میده چون متغیر داری بهش میدی باید خود مدل رو بهش بدی که برات بتونه از روش داخل کلاس خودش نمونه بسازه پس منم الان میخام این قابللیت رو داشته باشم که مدل بفرستم داخل کلاس هام ن اینکه نمونه هام فقط

چطور باید این کار رو انجام بدم ؟ فوق العاده راحت کافیه بیای جلو کلاست دایموند باز کنی و بعد داخلش یه اسم بهش بدی معمولا یا تی یا ئی اس یا ار هم بعضی وقتا میذارن اما تو میتونی هرچی بنویسی تو میتوونی بنویسی تایپ تو میتونی بنویسی سلام هرچی بخوای میتونی بنویسی معمولا میگم یا تی یا ئی اگر خیلی کم بیاد اس و ار هم استفاده میشه چون میتونی چند تا رو هم بگیری و همه رو با کاما از هم جدا کنم

مثلا بگم دو تا نوع میخام از ای و تی و بعد دو تا متغیر از نوع های مختلف تعریف کنم من فعللا یه دونه اش رو انجام میدم خب حالا اینی که تعریف کردم میتونم بیام ازش متغیر تعریف کنم مثلا همه متغیر های دیگه ای که دارم مثلا اینت کانتر و . .

حالا میتونم بیام بنویسم تی

این الان دقیقا یه متیغیر از نوع تی برای من تعریف میکنه تی چیه ؟ تی اون چیزی هستش که من از اینجا بهش میدم مثلا میام مینویسم استودنت ارری لیست بعد جلوش مینویسم از نوع مثلا فرض کن استودنت ها این استودنت رو میاره میذاره جای این تی برای من و از این تی یه نمونه یک متغیر برای من تعریف میکنه که همون استودنته اگر اونجا بنویسی سیرکل میاد برات سیرکل میزنه خب اولین کاری که انجام میدیم اسمش رو تغییر میدیم بجای اینکه اسمش شیپ ارری لیست باشه یا چیز استودنت ارری لیست باشه من اسمش رو میذارم raziarrylist چون میخوام همه چیز بپذیره

بعدش میتونم حالا بیام مثلا بیام اینجا برای این اولی بگم رازی ارری لیست از نوع استودنت و مساویش رو هم اینطوری بنویسم که برای من اینجا این ها رو بزنه

برای دومی هم بیام بنیوسم از نوع سیرکل حالا رازی ارریلیستت اولی استودنت میفرسته تو و دومی سیرکل میفرسته تو

اگر در دایموند دومی چیزی ننویسیم خود جاوا استتنتاج میکنه و خودش مثلا اگر استودنت گذاشته باشیم استودنت میذاره ولی در نسخه های جدید جاوا این اتفاق افتاده میتونیم قرار بدیم و مشکلی هم پیش نمیاد اگرم قرار ندیم بازم مشکلی پیش نمیاد چون خود جاوا اون رو استنتاج میکنه

خب الان من نوع داده رو فرستادم داخل الان باید کجا ازش استفاده کنم ؟ نکاتی رو باید رعایت کنم .

من الان این استودنتی که

مثلا فرض کن تو رازی مینویسیم از نوع استودنت بعد میگم اس مساوی با نیو استودنت میتونم ازش نمونه بسازم حالا ورودی هاش رو بهم بهش بدم



اما شما نمیتونید به سادگی از نوع داده جنریک نمونه بسازید

اگه اینطوری انجام بدین بهتون ارور میده

من نمیتونم از نوع داده جنریکم نمونه بسازم خب حالا به چه دردم میخوره اصلا وقتی نمیتونم نمونه ازش بسازم به چه دردم میخوره به این دردم میخوره که ما میخوایم ازش متغیر آدرس حافظه تعریف کنیم . خب از اول ترم کلی ما صحبت کردیم که ما میتونم متغیر ادرس حافظه تعریف کنیم از بیرون دپندنسی اینجکشن انجام بدیم داده های مختلفمون رو و کلی کار های حرفه ای انجام بدیم اما اون جا هایی که . .. یادتونه من یه استثناهایی رو بهتون گفتم ؟گفتم یه جاهایی بهتون گفتم که احتیاج دارم نمونه بسازم داخل کلاسم درسته که ما میگیم که باید دپندنسی اینجکشن انجام بشه ولی من نیاز دارم که نمونه بسازم مث چی ؟

مث اینجا که ارری لیست رو ساختم

خب اینجا گفتیم که نمیتونم ازش نمونه بسازم بر اساس چیزی که گفتم

خب گفتم نمیتونم ازش نمونه بسازم خب بر اساس چیزی که گفتیم ، گفتیم باید اینطوری بنویسیمش بگیم این تی باشه و بعد اینم تی باشه

نمیذاره ارایه هم ازش بسازی میگه به طور مستقیم نمیتونی این کار رو انجام بدی یه روش داره اما روش خیلی خوبی نیست با استفاده از رفلکشن هاست و خیلی خوب نیست چون اولا سرعت رو میاره پایین و دوما کار اصولی ای نیست برای اینجور مسئله ها خب من نیاز دارم نمونه بسازم و اینکه نمیتونم این کار رو انجام بدم . برم از بیرون بسازم ؟اگر از بیرون هم بسازم خب اشتباهه چرا من باید کاربرم رو وقتی که میخاد ارری لیست بسازه یه ساعت هم بیاد ارایه بسازه خودش ؟اصلا فرض کنیم که بتونه اون کار رو هم انجام بده

این پایین رو چیکار کنم این جا هم باز دارم تمپ رو میسازم اگه این رو هم اینطوری بنویسمش ارور میده

اینجا رو که دیگگه نمیشه به کاربرم بگم که کاربر برام دوباره یه ارایه بساز خودم باید بسازم این مشکلات رو چیکار کنیم این مشکل به راحتی حل میشه چطور ؟ ورودی ما کجا بود؟ متد ادد ، هیچ راه دیگه ای برای ورود داده اصلی به این کلاس نیست به غیراز ادد خب من اگر این رو تی بزارم پس صدرصد آبجکتی که میاد داخل این کلاس از نوع تی هستش حالا اون هرچی که میخواد باشه استودنت گذاشتی

صدرصد این نوع داده اش از نوع استودنته صدرصد نوع داده ای که وارد این میشه حتما حتما از نوع استودنته هیچ راه دیگه ای هم توی این کلاس وجود نداره که بتونی استودنتی رو بفرستی تو این رو هیچ جا نمیبینی به غیراز ادد

پس من مسیر ورودم رو محدود کردم از نوع تی حالا تی اینجا استودنته خب حالا کجا ذخیره اش کنم من که نمیتونم نمونه بسازم بجای اینکه توی تی ذخیره اش کنم از کلاس ریشه شون استفاده میکنم آبجکت ، توی آبجکت هر نوع داده ای میتونم قرار بدم و آبجکت رو میتونم ازش ارایه بسازم

اینجا هم که خروجیه میتونم آبجکت بزارم :

اینم که ورودیمونه که از نوع تی هستش به نظرتون مشکلش حل شد ؟

آبجکت مگه همه چی نمیپذیره ؟ خب این که انگار الان اشتباهه همه چی میتونم من داخل آبجکت قرار بدم درسته ؟ پس چطوری میگم الان من محدودش کردم ؟ داخل هرچی که میخاد باشه باشه اینجا ورودش رو محدود کردم

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

استودنت که میاد داخل این برای من داخل آبجکت قرارش میده اگر من این رو از نوع تی بذارم چی ؟


این میاد یه ارور بهم میده و اگر من کستش کنم به تی

برام کستش میکنه میتونم آبجکت هم بذارم حالا تی هم بذارم این سوالی بود که دوستتون هم پرسید . تمام آبجکت ها تی داخلشونه هیچ چیز دیگه ای داخلشون نی

پس من به راحتی الان رازی ارری لیست رو عمومیش کردم .

اما در این حال محدودیت هم دارم الان من نمیتونم داخل این رازی ارری لیستم که استودنت ها داخلشه

بیام سیرکل قرار بدم

اگر سیرکل قرار بدم بهم ارور میده

ولی در عین حال هم میتونم رازی ارری لیست ها رو از نوع سیرکل تعریفش کنم به خودمان بستگی داره که ارری لیستمان را از چه نوعی تعریف کنیم . حتی کلاس های خود جاوا

رازی ارری لیست استرینگ

اگه این جا که رازی ارری لیست رو از نوع استرینگ تعریف کردیم بیام و سیرکل بزنم باز بهم ارور میده میگه تو نمیتونی این کار رو انجام بدی اما رشته براش میفرستم میگم سلام و رشته رو ازم میگیره

الان من ارری لیست رو تعریف کردم دقیقا مثل ارری لیست خود جاوا حالا اون خیلی جزئیات بیشتری داره حالا عملکردش مثل همونه دیگه هم رشد میده هم میتونم ادد کنم هم میتونم گت کنم بعد گتش رو نگاه کنید

گتش رو من میگم اس مساوی است با استرینگ ارری لیست دات گت

از نوع استرینگه اصلا نیاز به ....... هم نیست

اما اگه اون رو ابجکت میذاشتم

این قسمت گتش رو ابجکت میذاشتم این الان درسته که کار میکنه اما اینجا باید کستش کنم

به این صورت به استرینگ کستش کنم و باید هر دفعه این کار رو انجام بدم ولی خب چرا این کار رو انجام بدم یه بار از داخل انجامش میدم دیگه مشکلی هم پیش نمیاد

درسته ؟ فهمیدین این ها رو ؟

من کمپریبلش رو الان میخوام انجام بدم اینجا نمیخوام توی یوتیلیتی انجامش بدم توی یوتیلییتی بخوای انجامش بدی به صورت جنریک یه خورده فرق داره چون کلاسیه که از هزاران کاربرد مختلف ممکنه توش داشته باشیم سورت باشه نمیدونم سرچ باشه مینیمم گرفتن ماکزیمم گرفتن و کلی چیز های مختلف دگیه پس اگه یه دونه جنریک بزارم همشان باید استفاده بشه مدل جنریکش یه جور دیگه است که بهتون میگمش پس به خاطر همین من میام اینجا یه دونه کلاس به اسم رازی سورت

و این کمپریبله رو میبرم اونجا خب چیزی که قبلا داشتیم این بود دیگه پرایویت مثلا کمپیربل ازنوع ارایه تعریفش میکردیم و براش سازنده میزدیم و در کنارش هم این رو داشتیم دیگه :»

البته ورودی هم نداشتیم و در کل به این صورت می شد :

این چیزی بود که قبلا داشتیمش خب اون مشکلی که صحبتش کردیم این بود که الان هرچیزی که من از اون رازی سورت استتفاده کنم

بعدش میگفتم رازی سورت دات سورت مثلا (خط 25 )

خب الان میخوام این مشکل رو حل کنیم که نشه استودنت رو با سیرکل کامپیرش کرد اصلا همچین چیزی نداریم مگه اینکه خودم بگم یعنی قابلیتش باشه هااخودم بگم

اها اینجا هم یه نکته بهتون بگم

تو این رازی ارری لیسته تا یادم نرفته اگر این رو براش نذاریم این آبجکت در نظرش میگیره و اگر آبجکت در نظرش بگیره میتونی سیرکل رو هم داخلش بذاری مثلا من الان اینجا توی همین رشته میذارم


مثلا میگم سلام اگر دایموند براش نذاری ها دایموند براش نذاری این رو آبجکت در نظر میگیره اصلا مقدار پیش فرض تی ابجکته موس رو روش نگهدارم

اره ببینید مستقیم اکستند ابجکته کلاس تی ای که تعریف شده نوع تی ای که تعریف شده ابجکته پس اگر شما مشخصش نکنید آبجکت در نظرش میگیره البته در صورتی آبجکت در نظرش میگیره من اینجا

من اینجا متغیر دیگه ای ازش در نظر نگرفته باشم

یعنی مثلا در حد همین ورودی گرفتن باشه داخل کلاس هام نیومده باشم جاهایی ازش متغیری تعریف کنم الان در مورد این صحبت میکنم این خیلی نکته مهمی هست

خودش ورودی و خروجیش آبجکت میشه مگر اینکه خودم مستقیم بهش بگم اما این چیزی هم که الان گفتم در صورتیه که مثلا یه همچین چیزی فیلدی نداشته باشم مثلا اگه تی رو داشته باشم از ایکس

این دیگه داستانش یه خورده فرق داره مثلا اون چیزیکه برای مرتب سازی داریمش اینجا الان میخوام درموردش صحبت کنم


اگه یه همچین چیزی داشته باشیم استنتاج میکنه یعنی چی استنتاج میکنه ؟یعنی به محض اینکه اولین برخورد با یه نوع داده اتفاق بیفته بقیه جاها رو از اون نوع در نظر میگیره مثلا من اینجا تی رو در نظر گرفتم

من اینجا تی رو در نظر گرفتم ادد میزنم استودنت ااولین برخورد تی رو استودنت در نظر میگیره و یک متغیر از استودنت

این داستانش یه خورده فرق داره در موردش صحبت میکنیم خودش استنتاجش میکنه حتی اگه ننویس ها الان اگه من نننویسم

الان من ننوشتمش

الان چوون من یه استودنت فرستادم داخل اولین بار است که این اتفااق میفته به محض اینکه برخورد این تی اون نوع داده اتفاق میفته استنتاج میکنه خودش اینم استودنت تعریف میکنه حالا در موردش بیشتر حرف میزنم

بزارید این مرتب سازی رو بهتون بگم خب حالا میخوام مشکل این رو حل کنم که هر کی نتونه با هر کلاس دیگه ای مقایسه بشه چیکارش کنم ؟ خب مشکلم نوع داده امه دیگه اون نوع داده ای که دارم باید یه خورده محدودش کنم دیگه خیلی این کمپریبل عمومیه درسته که کمپیر داره اما ما که نباید بتونیم با هر چیزی مقایسه بشه اولین کاری که میکنیم جنیرکش میکنیم خیلی ساده خب مسئله ای که دارم بهتون میگم چیه میگم باید قابل مقایسه باش هاز نوع خودش ن اینکه از نوع های دیگه یا اینکه یه چیز مشترکه بینشون قابل مقایسه باشه از نوع خودش کامپیربل باشه از نوع خودش یعنی چی این حرف یعنی چی که باید سعی کنم که تغییر بدم توی این مسئله اینجا جنریک رو گذاشتم

حالا دارم میگم کمپیربل باشه از نوع خودش این کمپیربلی که الان نوشتم

یعنی با هر آبجکتی که کمپیربل باشه میتونه مقایسه بشه ن من این رو نمیخوام باید کمپیربل باشه از نوع خودش فقط همین یعنی چی ؟یعنی کمپیربل رو باید جنریکش کنم یه تی بزارم جلوش

خب اگه این رو یانطوری بنویسم پس باید کمپیربل رو از اون ور جنریک کنم دیگه کمپیربل باشه از نوع خودش یعنی تی رو بگیر اینم از نوع خودش

یعنی این کلاسه کمپیربل بشه از نوع چی ؟از نوع یه کمپیربل از نوع خودش

پس این الان کمپیربل شد از نوع خودش

مهم مهم مهم

پس این سورتم برای کمپیربل ها هم این رو میزارم پس الان من صدرصد مطمئن هستم اگر بیام اینجا بنویسم رازی سورت بعد جلوش بنویسم استودنت

صدرصد فقط در صورتی از من قبول میکنه داده ها رو میاد برای من سعی کنه مقایسه کنه که از نوع استودنت باشن کمپیربلشون خب حالا چرا پس ارور نداد چون من هنوز استدونت هام کمپیربل آبجکتن

پس اینی هم که الان اینجا نوشتم در واقع نوشتم استودنت از نوع کمپیربل ابجکتی پس اینم هنوز قبول میکنه پس من استودنتم رو باید بیام بنویسم کمپیربل از نوع استودنت

فقط با استدونت ها مقایسه بشه ن اینکه با ابجکتیو بتونه مقایسه بشه سیرکلمم باید کمپیربل باشه از نوع سیرکل ها و اینم از نوع سیرکل باشه

اینم سیرکل باشه خب حالا من اگر این رو اجراش کنم این بهم ارور میده میگه تو نمیتونی که

بیای مثلا استودنت ها رو

میاد اینجا این کار رو انجام میده میاد داخل

رازی سورت میگه که رازی سورت خب این از نوع استودنته پس اینم کمپیربل از نوع استودنته

پس اینم فقط ارایه ای از نوع استودنت ها رو میپذیره ن اینکه هر نوع ارایه ای روبیاد برای من بپذیره و ارور میده میگه اصلا این امکان پذیر نیست همچین چیزی که تو میخوای انجام بدی و ازم قبولش نمیکنه دیگه اصلا کار به این نمیرسه قابل مقایسه شون کنه و مثلا حالا کلی داستان های مختلف اگر استودنتش رو هم نذارم

باز استنتاجش میکنه آیتم ها رو

البته اینجا چون از نوع کمپیربل اند مثلا من اگر بیام اینجا یه ارری لیستی از نوع یه ارایه ای از نوع استودنت ها داشته باشم به این بدم بعد دیگگه این رو نداشته باشم قبول نمیکنه الان من اگه بیام اینجا بنویسم سیرکل

خب این سیرکل رو من به این بدم بهم ارور میده میگه این کمپیربل از نوع استودنت ها نیست تو نمیتونی همچین کاری انجام بدی اون قابلیتی که بهتون گفتم من بتونم مثلا چندین آیتم رو تو کمپیربل تعریف کردم بعد بتونم بر اساس یه کلاس مشتریکی بینشون کمپیربلشون کنم چرا چون الان کمپیربل باشه ..... اینم انجام دادم بعد الان دایره ها با استودنت ها میتونن چیز بشن مثلا بیام این کار رو انجام بدم

الان میگه این یه دایره است میگم تیس دات گت شعاش رو بعد مقایسه اش کنم با استودنتی که در قسمت کست نوشتم که بیاد و با ایدیش مقایسه بشه چرا چون خودم گفتم کمپیربل از نوع استودنته این یکی گفتم کمپیربل از نوع استودنته مثللا استودنت با یه سیرکل میتونه مقایسه بشه

اما قبلیه اینطروی نبود

کمپیربل از نوع خالی نوشته بودم و كمپیربل خالی از نوع چیز بود دیگه آبجکت بود دیگه من اینجا معلوم بود که اصلا با چی میخواستم مقایسه اش کنم حالا این سیرکله و فقط سیرکل رو برای من میپذیره .

الان نمینشه که شعاع دایره رو با نمنره دانش اموز مشخص کرد؟

جواب : ن دیگه چون الان

این بر اساس کمپیربل سیرکل من نوشتم و نمیتونم این کار رو انجام بدم چون این رو نوشتم نمیتونم این کار رو انجام بدم . قابل مقایسه بر اساس خود سیرکله یعنی هر دایره با یه دایره دیگه مقایسه میشه مثل این میمونه مثلا من بهتون بگم فرض کن دو تا للیوان مثلا دارم با یه دونه موس مثلا مثلا فرض کن این لیوان رو با این موس میخوام مقایسه کنم خب این تو حالت معمولیش چیز درستی نیست مگر اینکه خودم بگم بر چه اساس مثلا میگم فرض کن لیوانه قابل مقایسه اس با موس ها چطوری میگم قابل مقایسه است ؟

مثلا میگم ارتفاع این لیوانه با ارتفاع این موسه قابل مقایسه باشه

بعد دیگه با هم قابل مقایسه نیست دیگه یعنی خود دایره الان نمیتونم با دایره مقایسه اش کنم اگر اینجا هم بنویسم از نوع استودنت

دیگه نمیتونم با دایره مقایسه اش کنم یه دایره با یه دایره دیگه قابل مقایسه نیست بستگی به خودت داره

حالا ممکنه این اصلا یه چیز بی ربطی هم باشه ها خب دایره که با دایره باید قابل مقایسه باشه ولی خب بستگی به تعریف خودتون داره یه جایی میخوای دو تا ابجکت با دو تا دنیای مختلف رو با هم مقایسه کنی خودت میتونی به طور مستقیم بیای بگی این ابجکت با این نوع ابجکت قابل مقایسه میشه یا اینکه با خودش مقایسه میشه یا با یک نوع دیگه مقایسه میشه یا گروهی از ابجکت ها با هم مقایسه میشنیه کلاس یه سوپر کلاس کلی مثلا در نظر بگیرین

کاری که ما الان انجام دادیم همه چیز رو مشخص کردیم ابهام ها رفع شدن رفع ابهام کردیم گفتیم این با این مقایسه میشه همین تموم نمیتونیم با چیز دیگه ای مقایسه اش کنی که اون ابهام ها به وجود بیاد هر کی به هر کی باشه هر چیزی رو با هرچی بخوای مقایسه کنی ن نمیتونی که مقایسه کنی من میگم این رو با اون مقایسه میکنم اگه این رو گفتی پس ابهامی وجود نداره پس مشکلی پیش نمیاد پس وقتی که من میام داخل سیرکل میگم این بر اساس استودنت مثلا باید باشه ازم قبول نمیکنه که کمپیربلم از نوع سیرکل باشه بهم ارور میده کمپیربلی بنویس که بیاد برات با استودنت مقایسه کنه پس صدرصد استودنت ازم میخاد من اینجا خودم باید بیام کستش رو انجام بدم

ممکننه با خودتون بگین اصلا این چه کاریه اون ابجکته رو اصلا مینوشتیم خب اینجا باز همون ابجمکتش بودمن میتونستم دوباه بیام به استودنت کستش کنم میتونستی انجامش بدی اما ابهام داشت اگر کاربر این کار رو انجام نمیداد چی تو برنامه ات رو نوشتی توسعه اش دادی کتابخاانه اش کردی دادیش دست مردم دارن استفاده میکنن کست نمیکنه اشتباهی میاد کست میکنه به دایره خب بهت ارور میده دیگه دیگه اون برنامه ات اجرا میشه خبر نداری میاد کار میکنه میزنه این کتابخانه ای که به من فروخت خرابه فلانه پول منم برد و . .. هزار تا حرف هم بهتون میزنه برنامه تون غیر استاندارد میشه دیگه ابهام داره

اماا الان تو ابهام ها رو رفع میکنی میگید اگر هر نوع داده ای که میخاد باهاش مقایسه کنی رو بنویس اگر نوشتی تو کامپیربلت دیگه اجازه نمیده چیز دیگه ای اینجا بنویسی اینجا بنویسی سیرکل بهت ارور میده

باید قابل مقایسه از نوع استودنت باشی که برنامه ات ابهام نداشته باشی خب اگه سوالی هست بپرسین اگر ن برای امروزتون کافیه







genericioc4شی گرایی در جاوا
دانشجوی کارشناسی کامپیوتر
شاید از این پست‌ها خوشتان بیاید