آموزش متد های جنریک در جاوا، کامل و جامع
جلسات دوره
مهدی عباسی
مهدی عباسی هستم، مسلط به حداقل ۲۰ زبان مطرح برنامه نویسی به صورت پیشرفته، مدیر عامل شرکت آریا نرم افزار و بنیانگذار آکادمی درسمن، مسلط به تدریس دروس تخصصی کاردانی و کارشناسی کامپیوتر، پایگاه داده ها، برنامه نویسی پیشرفته، مبانی برنامه نویسی، مباحث ویژه طراحی وب و .... مشاهده رزومه
آموزش متدهای جنریک در جاوا، کامل و جامع
در جلسه گذشته کلاسهای جنریک را یاد گرفتیم. در این جلسه میخواهیم با متدهای جنریک در جاوا آشنا شویم.
بدنه متدهای جنریک مانند بقیه متدها است اما تفاوت آن ها در استفاده از نوع داده ورودی و خروجی است.
متدهای جنریک متدهایی هستند که هنگام تعریف آنها به جای نوشتن نوع داده مختلف در ورودی یا خروجی تابع از پارامتر نوع داده در بین دو کاراکتر<> استفاده میشود.
برای ساخت متدهای جنریک باید کلاس از نوع جنریک تعریف شده باشد و یا قبل از تعریف نام متد پارامتر را تعریف کنیم.
public class MyClass1 {
public <T> T fun1(T data){
System.out.println(data.getClass().getName());
return data;
}
}
متد fun1 یک ورودی جنریک دریافت میکند و نام کلاس آن را چاپ میکند و سپس خود تابع را برمیگرداند.
public static void main(String[] args) {
MyClass1 m1=new <Boolean>MyClass1(true);
System.out.println(m1.fun1(3000));
System.out.println(m1.fun1("ali"));
}
خروجی
java.lang.Integer
3000
java.lang.String
ali
همچنین میشود متدی تعریف کرد که ورودی نداشته باشد و خروجی آن جنریک باشد.
public class MyClass1 {
public <T> T fun2(){
return (T)"Hello java";
}
}
زمانی که یک تابع ورودی نداشته باشد و خروجی آن جنریک باشد باید قبل از فراخانی تابع نوع آن مشخص شود
MyClass1 m1=new <Boolean>MyClass1(true);
System.out.println(m1.<String>fun2());
System.out.println(m1.<Integer>fun2());
System.out.println(m1.<Double>fun2());
خروجی
Hello java
Hello java
Hello java
میخواهیم یک تابع بسازیم که یک عدد(int, double, float, long, …) بگیرد و آن عدد را + 10 کند و به عنوان خروجی برگرداند.
public class MyClass2 {
public static double fun1(Number num){
return num.doubleValue()+10;
}
}
نحوه فراخوانی متد
System.out.println(MyClass2.fun1(12));
System.out.println(MyClass2.fun1(12.456));
System.out.println(MyClass2.fun1((long)24543654));
System.out.println(MyClass2.fun1((short)24));
خروجی
22.0
22.456
2.4543664E7
34.0
حال میخواهیم یک تابع بنویسم که لیستی از اعداد(int, float, long, short, …) را بگیرد و جمع اعداد را برگرداند.
public static double fun2(List<Number> numbers){
double sum=0;
for(Number number:numbers){
sum+=number.doubleValue();
}
return sum;
}
نحوه فراخانی متد
List<Number> list1=new ArrayList<>(Arrays.asList(12,3,5,67,67));
List<Integer> list2=new ArrayList<>(Arrays.asList(12,3,5,67,67));
List<Double> list3=new ArrayList<>(Arrays.asList(12.33,3.14,56.789));
System.out.println(MyClass2.fun2(list1));
System.out.println(MyClass2.fun2(list2));
System.out.println(MyClass2.fun2(list3));
اما بجز list1 بقیه لیستها هنگام صدا زدن تابع fun2 با خطا مواجعه میشود. علت آن این است که لیستی از Interger و لیستی از Double فرزند لیستی از Number نیستند و به همین علت با خطا مواجعه میشود.
برای حل این خطا کد زیر را جایگزین تابع fun2 میکنیم.
public static double fun2(List<? extends Number> numbers){
double sum=0;
for(Number number:numbers){
sum+=number.doubleValue();
}
return sum;
}
در واقع در متد بالا گفتیم هر کلاسی که فرزند number باشد مورد تایید است.
بسیار خرسندیم که با یک جلسه دیگر از این آموزش جاوا پیشرفته در خدمت شما بودیم و توانستیم به پیشرفت شما دوستان عزیز کمک کنیم. شما عزیزان میتوانید برای دسترسی بیشتر به جلسات این دوره از آموزش، آن را دانلود کنید.
شما درسمنی های عزیز هر گونه سوال یا ابهامی از این جلسه داشتید میتوانید به انجمن برنامه نویسان جاوا مراجعه کنید و سوالات خود را بپرسید.
ممنون از همراهی شما
نظر شما در تصمیم دیگران اثرگذار است.
لطفا برای همراهان درسمن و بهتر شدن دوره نظر خود را بنویسید.