Upper Bounded Wildcards در جاوا

+2 رأی
میانگین بازدید روزانه 0.6182 بازدید

کلاس Book

public class Book {
}

کلاس Booklet

public class Booklet extends Book {
}

کلاس Album

public class Album extends Book {
}

کلاس Main

public class Main {

  public static void main(String[] args) {
  }
	
	/**
	* Hierarchy: Book -> Album
	*                 -> Booklet
	* Allowed types: List<Book>, List<Album>, List<Booklet>
	*/
	public void upperBoundedMethod(List<? extends Book> books) {
    Book book = books.get(0); // It is fine

    books.add(new Album()); // compile-time error
    books.add(new Book()); // compile-time error
    books.add(null);
	}
}

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

سوال 4 ماه قبل در تالار برنامه نویسی توسط sina-deuxshiri (12 امتیاز)
برچسب گذاری مجدد در 4 ماه قبل توسط moderator

1 جواب

+1 رأی
 
بهترین جواب

وقتی شما از extends برای مشخص کردن Boundary در Wildcard استفاده می کنید بدین معنی است که:

  • شما یک لیست از اشیائی دارید که یا از جنس کلاس Book هستند و یا ساب کلاس های Book مثل Album و Booklet. 

بهمین خاطر خواندن از این لیست safe است و می توان براحتی هر کدام از اشیاء خوانده شده را در متغییری از جنس Book دخیره کرد (cast). 

اما نمی توانید به این لیست شئ اضافه کنید بدلیل اینکه نمی دانید لیستی که بعنوان پارامتر برای متد شما ارسال شده از جنس Book است یا Booklet یا Album:

        upperBoundedMethod(new ArrayList<Book>());
        upperBoundedMethod(new ArrayList<Album>());
        upperBoundedMethod(new ArrayList<Booklet>());

نکته ۱: در جاوا در زمان کامپایل نوع داده Generics مشخص می شود.

نکته۲وقتی شما از super برای مشخص کردن Boundary در Wildcard استفاده می کنید بر عکس این اتفاق می افتد و شما برای اقزودن به لیست مشکلی ندارد و برای خواندن از آن مشکل دارید.

جواب 4 ماه قبل توسط Saeed Zarinfam (717 امتیاز)
انتخاب شده در 4 ماه قبل توسط sina-deuxshiri

سوال های مشابه

+1 رأی
1 جواب میانگین بازدید روزانه 0.23570 بازدید
0 رأی
2 جواب میانگین بازدید روزانه 0.481,184 بازدید
+1 رأی
1 جواب میانگین بازدید روزانه 0.25655 بازدید
+2 رأی
1 جواب میانگین بازدید روزانه 0.3568 بازدید
+2 رأی
1 جواب میانگین بازدید روزانه 0.4373 بازدید
سوال 5 ماه قبل در تالار برنامه نویسی توسط 1993 (242 امتیاز)
+1 رأی
2 جواب میانگین بازدید روزانه 0.39328 بازدید
0 رأی
1 جواب میانگین بازدید روزانه 0.21387 بازدید
+1 رأی
2 جواب میانگین بازدید روزانه 0.791,559 بازدید
سوال 5 سال قبل در تالار برنامه نویسی توسط sara_sheikhi (20 امتیاز)
0 رأی
1 جواب میانگین بازدید روزانه 0.09214 بازدید
+1 رأی
1 جواب میانگین بازدید روزانه 0.09232 بازدید
کانال تلگرام جواب یاب
...