+1 امتیاز
قبل در برنامه نویسی توسط (19 امتیاز)
ویرایش شده قبل توسط

لطفا به کد زیر دقت کنید:

class Test {

	public void f(Test test) {

	}

	public <E extends Test> void f(E e) {
		
	}

}

در کد بالا متدی که یک پارامتر عام مشخص می‌کند، در فرآیند Erasure خاص‌ترین نوع را در نظر می‌گیرد که همان کلاس Test است. بنابراین به دلیل اینکه دو متد فوق امضاهای یکسان دارند، با خطای کامپایل مواجه می‌شویم.

اما حالا به کد زیر توجه کنید:

class Test {

	public void f(Test test) {

	}

	public <E> void f(E e) {

	}

}

public class Main {

	public static void main(String[] args) {
		Test test = new Test();

		test.f(test);
		test.f(test);
	}

}

در کد فوق هیچ خطایی به وجود نمیاد. چرا؟

2 پاسخ

+2 امتیاز
قبل توسط (693 امتیاز)
انتخاب شده قبل توسط
 
بهترین پاسخ

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

public <E extends Test> void f(E e) {
   e.printTest();
}

پس دیگری نیازی به تعریف

 public void f(Test test) {
 test.printTest();
    }

ندارید

اما در مثال دوم شما فقط در دو صورت می توانید به متدها دسترسی داشته باشید با استفاده از reflection یا cast کردن به تایپ مورد نظر .

public <E> void f(E e) {
 if(e.getClass().equals(Test.class)
((Test)e).printTest();
    }

اما در این روش هر تایپی غیر از Test نیز می توانید به آن پاس کنید .

public <E> void f(E e) {
 if(e.getClass().equals(Test.class)
((Test)e).printTest();
 if(e.getClass().equals(Person.class)
((Person)e).printName();
    }

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

+1 امتیاز
قبل توسط (10 امتیاز)
ویرایش شده قبل توسط
در قسمت اول به این دلیل خطا کامپایل گرفته میشه چون اگر کلاسی از Test ارث بری کرده باشه می تونه به کلاس Test تبدیل بشه لذا در زمان اجرا کمپایلر متوجه نمیشه که باید کدوم متد رو فراخونی کنه چون ورودی هر کدوم ورودی دیگر هم میتونه میشه...

سوالات مشابه

+1 امتیاز
2 پاسخ 2.0هزار بازدید
سوال شده 8 سال قبل در برنامه نویسی توسط sara_sheikhi (20 امتیاز)
+1 امتیاز
1 پاسخ 982 بازدید
+1 امتیاز
1 پاسخ 314 بازدید
+1 امتیاز
1 پاسخ 1.5هزار بازدید
+2 امتیاز
1 پاسخ 336 بازدید
سوال شده 3 سال قبل در برنامه نویسی توسط sina-deuxshiri (12 امتیاز)
+2 امتیاز
1 پاسخ 407 بازدید
سوال شده 3 سال قبل در برنامه نویسی توسط 1993 (242 امتیاز)
0 امتیاز
1 پاسخ 435 بازدید
...