+2 امتیاز
قبل در برنامه نویسی توسط (12 امتیاز)
برچسب گذاری دوباره قبل توسط

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

1 پاسخ

+1 امتیاز
قبل توسط (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 استفاده می کنید بر عکس این اتفاق می افتد و شما برای اقزودن به لیست مشکلی ندارد و برای خواندن از آن مشکل دارید.

سوالات مشابه

+1 امتیاز
1 پاسخ 978 بازدید
0 امتیاز
2 پاسخ 1.6هزار بازدید
+1 امتیاز
1 پاسخ 1.5هزار بازدید
+2 امتیاز
1 پاسخ 450 بازدید
+2 امتیاز
1 پاسخ 404 بازدید
سوال شده 3 سال قبل در برنامه نویسی توسط 1993 (242 امتیاز)
+1 امتیاز
2 پاسخ 813 بازدید
+1 امتیاز
2 پاسخ 2.0هزار بازدید
سوال شده 8 سال قبل در برنامه نویسی توسط sara_sheikhi (20 امتیاز)
0 امتیاز
1 پاسخ 432 بازدید
...