saharalijannejad / Java-Learn

Learn Java in Persian Language
0 stars 0 forks source link

Learn Generic in Java #3

Open saharalijannejad opened 3 months ago

saharalijannejad commented 3 months ago

جنریک‌ها (Generics) در جاوا به ما اجازه می‌دهند تا کلاس‌ها، اینترفیس‌ها و متدها را به صورت پارامتری تعریف کنیم، به طوری که نوع داده‌ها به صورت پارامتری تعریف شوند. این قابلیت باعث می‌شود کد ما انعطاف‌پذیرتر و ایمن‌تر شود.

تعریف جنریک‌ها در کلاس‌ها می‌توانیم یک کلاس جنریک تعریف کنیم که نوع داده‌های ورودی آن به صورت پارامتری مشخص شود. به عنوان مثال، یک کلاس جنریک به نام Box که می‌تواند هر نوع داده‌ای را نگه‌داری کند:

public class Box { private T content;

public void setContent(T content) {
    this.content = content;
}

public T getContent() {
    return content;
}

}

در اینجا، T یک پارامتر نوع است که می‌تواند هر نوع داده‌ای باشد. حالا می‌توانیم از این کلاس برای نگه‌داری هر نوع داده‌ای استفاده کنیم: public class Main { public static void main(String[] args) { Box intBox = new Box<>(); intBox.setContent(123); System.out.println("Integer Box: " + intBox.getContent());

    Box<String> strBox = new Box<>();
    strBox.setContent("Hello Generics");
    System.out.println("String Box: " + strBox.getContent());
}

}


تعریف جنریک‌ها در متدها متدهای جنریک نیز مشابه کلاس‌های جنریک تعریف می‌شوند. به عنوان مثال، یک متد جنریک که دو عنصر را جابجا می‌کند:

public class Utility { public static void swap(T[] array, int i, int j) { T temp = array[i]; array[i] = array[j]; array[j] = temp; } }

می‌توانیم این متد را به صورت زیر استفاده کنیم:

public class Main { public static void main(String[] args) { Integer[] intArray = {1, 2, 3, 4}; Utility.swap(intArray, 1, 2); System.out.println("Swapped Integer Array: " + Arrays.toString(intArray));

    String[] strArray = {"A", "B", "C"};
    Utility.swap(strArray, 0, 2);
    System.out.println("Swapped String Array: " + Arrays.toString(strArray));
}

}


محدود کردن پارامترهای نوع می‌توانیم پارامترهای نوع را محدود کنیم تا فقط نوع‌های خاصی را قبول کنند. برای این کار از کلیدواژه extends استفاده می‌کنیم. به عنوان مثال، یک کلاس جنریک که فقط نوع‌های فرزند Number را قبول می‌کند:

public class NumericBox { private T content;

public void setContent(T content) {
    this.content = content;
}

public T getContent() {
    return content;
}

public double doubleValue() {
    return content.doubleValue();
}

}

استفاده از wildcard در جاوا، از ? به عنوان wildcard استفاده می‌شود تا به هر نوعی اشاره کند. به عنوان مثال، یک لیست از هر نوع داده‌ای:

public class WildcardDemo { public static void printList(List<?> list) { for (Object elem : list) { System.out.println(elem); } }

public static void main(String[] args) {
    List<Integer> intList = Arrays.asList(1, 2, 3);
    List<String> strList = Arrays.asList("A", "B", "C");

    printList(intList);
    printList(strList);
}

}


جنریک‌ها در جاوا به ما اجازه می‌دهند تا کدهایی انعطاف‌پذیرتر و ایمن‌تر بنویسیم. با استفاده از جنریک‌ها، می‌توانیم کلاس‌ها، متدها و اینترفیس‌هایی بنویسیم که با هر نوع داده‌ای کار کنند، بدون اینکه نیاز باشد برای هر نوع داده‌ای یک نسخه مجزا ایجاد کنیم.