Upper Bounded Wildcards در جاوا

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

کلاس 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 با خطای کامپایل مواجه نمی‌شویم.

سوال 3 هفته قبل در تالار برنامه نویسی توسط sina-deuxshiri (12 امتیاز)
برچسب گذاری مجدد در 3 هفته قبل توسط 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 استفاده می کنید بر عکس این اتفاق می افتد و شما برای اقزودن به لیست مشکلی ندارد و برای خواندن از آن مشکل دارید.

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

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

+1 رأی
1 جواب میانگین بازدید روزانه 0.22525 بازدید
0 رأی
2 جواب میانگین بازدید روزانه 0.491,143 بازدید
+1 رأی
1 جواب میانگین بازدید روزانه 0.24602 بازدید
+2 رأی
1 جواب میانگین بازدید روزانه 0.5850 بازدید
+2 رأی
1 جواب میانگین بازدید روزانه 0.849 بازدید
سوال 1 ماه قبل در تالار برنامه نویسی توسط 1993 (246 امتیاز)
+1 رأی
2 جواب میانگین بازدید روزانه 0.4294 بازدید
0 رأی
1 جواب میانگین بازدید روزانه 0.21368 بازدید
+1 رأی
2 جواب میانگین بازدید روزانه 0.811,519 بازدید
سوال 5 سال قبل در تالار برنامه نویسی توسط sara_sheikhi (20 امتیاز)
0 رأی
1 جواب میانگین بازدید روزانه 0.09213 بازدید
+1 رأی
1 جواب میانگین بازدید روزانه 0.09222 بازدید
کانال تلگرام جواب یاب
...