Java Generics হলো Java এর একটি শক্তিশালী বৈশিষ্ট্য যা টাইপ সুরক্ষা এবং কোডের পুনরায় ব্যবহারযোগ্যতা উন্নত করার জন্য ডিজাইন করা হয়েছে। এটি ডেভেলপারদের একটি ক্লাস, ইন্টারফেস, বা মেথড তৈরি করার সময় টাইপ প্যারামিটার ব্যবহার করার সুযোগ দেয়, যা রানটাইমের পরিবর্তে কম্পাইল টাইমে টাইপ চেক করতে সহায়ক। Generics এর মাধ্যমে কোড লেখা সহজ হয় এবং টাইপ সম্পর্কিত ত্রুটি কমে যায়।
Java Generics হলো একটি শক্তিশালী ফিচার, যা Java 5 থেকে পরিচিত করা হয়েছে। Generics এর মূল উদ্দেশ্য হলো type safety এবং code reusability নিশ্চিত করা। Generics ব্যবহার করে আপনি type parameters নির্দিষ্ট করতে পারেন, যা ডেভেলপারদের একাধিক ডেটা টাইপের সাথে কাজ করার জন্য একটি generic class, method, বা interface তৈরি করতে সাহায্য করে।
Generics আপনাকে compile-time type checking করতে দেয়, যার মাধ্যমে আপনি একধরনের ডেটা টাইপের সঙ্গে অন্য ডেটা টাইপ মিশ্রিত করতে পারবেন না। এর ফলে runtime exceptions এর সম্ভাবনা কমে যায়।
Generics এর সাথে টাইপ প্যারামিটার যোগ করার জন্য angle brackets (<>) ব্যবহার করা হয়। সাধারণত, Generics এর ক্ষেত্রে এই টাইপ প্যারামিটারগুলো ব্যবহার করা হয়:
Generics ব্যবহার করে আপনি একটি generic class তৈরি করতে পারেন, যা একাধিক টাইপের ডেটা নিয়ে কাজ করতে সক্ষম।
// Generic ক্লাস যা T টাইপের ডেটা গ্রহণ করে
class Box<T> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
public class GenericClassExample {
public static void main(String[] args) {
// String টাইপের জন্য Box তৈরি করা
Box<String> stringBox = new Box<>();
stringBox.setValue("Hello, Generics");
System.out.println("String Box Value: " + stringBox.getValue());
// Integer টাইপের জন্য Box তৈরি করা
Box<Integer> integerBox = new Box<>();
integerBox.setValue(123);
System.out.println("Integer Box Value: " + integerBox.getValue());
}
}
এই উদাহরণে, Box নামে একটি generic class তৈরি করা হয়েছে, যা যেকোনো টাইপের ডেটা রাখতে সক্ষম। এখানে আমরা String এবং Integer টাইপের জন্য আলাদা দুটি Box তৈরি করেছি।
আউটপুট:
String Box Value: Hello, Generics
Integer Box Value: 123
Generics শুধুমাত্র class নয়, method-এর জন্যও ব্যবহার করা যায়। নিচে একটি generic method এর উদাহরণ দেওয়া হলো:
public class GenericMethodExample {
// Generic মেথড যা যেকোনো টাইপের ডেটা প্রিন্ট করতে সক্ষম
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
public static void main(String[] args) {
// String অ্যারে প্রিন্ট করা
String[] stringArray = {"Apple", "Banana", "Mango"};
printArray(stringArray);
// Integer অ্যারে প্রিন্ট করা
Integer[] intArray = {1, 2, 3, 4, 5};
printArray(intArray);
}
}
উপরের উদাহরণে, printArray নামে একটি generic method তৈরি করা হয়েছে, যা যেকোনো টাইপের অ্যারে প্রিন্ট করতে সক্ষম।
আউটপুট:
Copy code
Apple
Banana
Mango
1
2
3
4
5
কখনও কখনও আপনি চান যে একটি টাইপ প্যারামিটার শুধুমাত্র নির্দিষ্ট একটি টাইপ বা তার সাবটাইপ হতে পারবে। এ ক্ষেত্রে bounded type parameter ব্যবহার করা হয়।
// Bounded টাইপের জন্য Generic ক্লাস
class NumberBox<T extends Number> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
public class BoundedTypeExample {
public static void main(String[] args) {
// শুধুমাত্র Number এর সাবটাইপ গ্রহণ করে
NumberBox<Integer> integerBox = new NumberBox<>();
integerBox.setValue(10);
System.out.println("Integer Value: " + integerBox.getValue());
NumberBox<Double> doubleBox = new NumberBox<>();
doubleBox.setValue(5.5);
System.out.println("Double Value: " + doubleBox.getValue());
// NumberBox<String> stringBox = new NumberBox<>(); // এটি কম্পাইল হবে না, কারণ String Number এর সাবক্লাস নয়।
}
}
উপরের উদাহরণে, NumberBox ক্লাসটি শুধুমাত্র Number এর সাবটাইপগুলো (যেমন Integer, Double) গ্রহণ করবে। String টাইপ গ্রহণ করলে এটি কম্পাইল হবে না।
আউটপুট:
Integer Value: 10
Double Value: 5.5
Generics এ wildcards ব্যবহার করে আপনি জেনেরিক টাইপের আরো ফ্লেক্সিবিলিটি পেতে পারেন। Wildcards সাধারণত ? দিয়ে চিহ্নিত করা হয়।
public class WildcardExample {
// Unbounded Wildcard ব্যবহার করে যেকোনো টাইপের লিস্ট প্রিন্ট করা যায়
public static void printList(List<?> list) {
for (Object element : list) {
System.out.println(element);
}
}
public static void main(String[] args) {
List<String> stringList = Arrays.asList("Apple", "Banana", "Mango");
List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5);
printList(stringList);
printList(intList);
}
}
উপরের উদাহরণে, <?> ব্যবহার করে আমরা যেকোনো টাইপের লিস্ট প্রিন্ট করতে পারছি।
আউটপুট:
Apple
Banana
Mango
1
2
3
4
5
import java.util.List;
public class UpperBoundedWildcardExample {
// Upper Bounded Wildcard যা শুধুমাত্র Number এর সাবটাইপ গ্রহণ করে
public static void printNumbers(List<? extends Number> list) {
for (Number number : list) {
System.out.println(number);
}
}
public static void main(String[] args) {
List<Integer> intList = Arrays.asList(1, 2, 3);
List<Double> doubleList = Arrays.asList(1.1, 2.2, 3.3);
printNumbers(intList);
printNumbers(doubleList);
}
}
এই উদাহরণে, <? extends Number> ব্যবহার করে শুধুমাত্র Number এর সাবটাইপগুলোকে প্রিন্ট করা হচ্ছে।
আউটপুট:
1
2
3
1.1
2.2
3.3
import java.util.List;
import java.util.ArrayList;
public class LowerBoundedWildcardExample {
// Lower Bounded Wildcard যা শুধুমাত্র Integer এবং এর সুপারটাইপ গ্রহণ করে
public static void addNumbers(List<? super Integer> list) {
for (int i = 1; i <= 5; i++) {
list.add(i);
}
}
public static void main(String[] args) {
List<Number> numberList = new ArrayList<>();
addNumbers(numberList);
System.out.println(numberList);
}
}
এই উদাহরণে, <? super Integer> ব্যবহার করে শুধুমাত্র Integer এবং তার সুপারক্লাসের টাইপের জন্য কাজ করা হয়েছে।
আউটপুট:
[1, 2, 3, 4, 5]
Java Generics ডেভেলপারদের জন্য টাইপ সেফ কোড লিখতে সহায়তা করে এবং একই কোডকে বিভিন্ন টাইপের ডেটার জন্য পুনর্ব্যবহারযোগ্য করে তোলে। Generics ব্যবহার করলে runtime errors এর সম্ভাবনা কমে যায় এবং কোডের রিডেবিলিটি ও মেইনটেনেন্স বাড়ে। Generics এর মাধ্যমে ডেভেলপাররা একটি ক্লাস বা মেথড একাধিক টাইপের জন্য ব্যবহার করতে পারেন, যার ফলে কোড আরও কার্যকর এবং সংক্ষিপ্ত হয়।
Java Generics হলো Java এর একটি শক্তিশালী বৈশিষ্ট্য যা টাইপ সুরক্ষা এবং কোডের পুনরায় ব্যবহারযোগ্যতা উন্নত করার জন্য ডিজাইন করা হয়েছে। এটি ডেভেলপারদের একটি ক্লাস, ইন্টারফেস, বা মেথড তৈরি করার সময় টাইপ প্যারামিটার ব্যবহার করার সুযোগ দেয়, যা রানটাইমের পরিবর্তে কম্পাইল টাইমে টাইপ চেক করতে সহায়ক। Generics এর মাধ্যমে কোড লেখা সহজ হয় এবং টাইপ সম্পর্কিত ত্রুটি কমে যায়।
Java Generics হলো একটি শক্তিশালী ফিচার, যা Java 5 থেকে পরিচিত করা হয়েছে। Generics এর মূল উদ্দেশ্য হলো type safety এবং code reusability নিশ্চিত করা। Generics ব্যবহার করে আপনি type parameters নির্দিষ্ট করতে পারেন, যা ডেভেলপারদের একাধিক ডেটা টাইপের সাথে কাজ করার জন্য একটি generic class, method, বা interface তৈরি করতে সাহায্য করে।
Generics আপনাকে compile-time type checking করতে দেয়, যার মাধ্যমে আপনি একধরনের ডেটা টাইপের সঙ্গে অন্য ডেটা টাইপ মিশ্রিত করতে পারবেন না। এর ফলে runtime exceptions এর সম্ভাবনা কমে যায়।
Generics এর সাথে টাইপ প্যারামিটার যোগ করার জন্য angle brackets (<>) ব্যবহার করা হয়। সাধারণত, Generics এর ক্ষেত্রে এই টাইপ প্যারামিটারগুলো ব্যবহার করা হয়:
Generics ব্যবহার করে আপনি একটি generic class তৈরি করতে পারেন, যা একাধিক টাইপের ডেটা নিয়ে কাজ করতে সক্ষম।
// Generic ক্লাস যা T টাইপের ডেটা গ্রহণ করে
class Box<T> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
public class GenericClassExample {
public static void main(String[] args) {
// String টাইপের জন্য Box তৈরি করা
Box<String> stringBox = new Box<>();
stringBox.setValue("Hello, Generics");
System.out.println("String Box Value: " + stringBox.getValue());
// Integer টাইপের জন্য Box তৈরি করা
Box<Integer> integerBox = new Box<>();
integerBox.setValue(123);
System.out.println("Integer Box Value: " + integerBox.getValue());
}
}
এই উদাহরণে, Box নামে একটি generic class তৈরি করা হয়েছে, যা যেকোনো টাইপের ডেটা রাখতে সক্ষম। এখানে আমরা String এবং Integer টাইপের জন্য আলাদা দুটি Box তৈরি করেছি।
আউটপুট:
String Box Value: Hello, Generics
Integer Box Value: 123
Generics শুধুমাত্র class নয়, method-এর জন্যও ব্যবহার করা যায়। নিচে একটি generic method এর উদাহরণ দেওয়া হলো:
public class GenericMethodExample {
// Generic মেথড যা যেকোনো টাইপের ডেটা প্রিন্ট করতে সক্ষম
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
public static void main(String[] args) {
// String অ্যারে প্রিন্ট করা
String[] stringArray = {"Apple", "Banana", "Mango"};
printArray(stringArray);
// Integer অ্যারে প্রিন্ট করা
Integer[] intArray = {1, 2, 3, 4, 5};
printArray(intArray);
}
}
উপরের উদাহরণে, printArray নামে একটি generic method তৈরি করা হয়েছে, যা যেকোনো টাইপের অ্যারে প্রিন্ট করতে সক্ষম।
আউটপুট:
Copy code
Apple
Banana
Mango
1
2
3
4
5
কখনও কখনও আপনি চান যে একটি টাইপ প্যারামিটার শুধুমাত্র নির্দিষ্ট একটি টাইপ বা তার সাবটাইপ হতে পারবে। এ ক্ষেত্রে bounded type parameter ব্যবহার করা হয়।
// Bounded টাইপের জন্য Generic ক্লাস
class NumberBox<T extends Number> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
public class BoundedTypeExample {
public static void main(String[] args) {
// শুধুমাত্র Number এর সাবটাইপ গ্রহণ করে
NumberBox<Integer> integerBox = new NumberBox<>();
integerBox.setValue(10);
System.out.println("Integer Value: " + integerBox.getValue());
NumberBox<Double> doubleBox = new NumberBox<>();
doubleBox.setValue(5.5);
System.out.println("Double Value: " + doubleBox.getValue());
// NumberBox<String> stringBox = new NumberBox<>(); // এটি কম্পাইল হবে না, কারণ String Number এর সাবক্লাস নয়।
}
}
উপরের উদাহরণে, NumberBox ক্লাসটি শুধুমাত্র Number এর সাবটাইপগুলো (যেমন Integer, Double) গ্রহণ করবে। String টাইপ গ্রহণ করলে এটি কম্পাইল হবে না।
আউটপুট:
Integer Value: 10
Double Value: 5.5
Generics এ wildcards ব্যবহার করে আপনি জেনেরিক টাইপের আরো ফ্লেক্সিবিলিটি পেতে পারেন। Wildcards সাধারণত ? দিয়ে চিহ্নিত করা হয়।
public class WildcardExample {
// Unbounded Wildcard ব্যবহার করে যেকোনো টাইপের লিস্ট প্রিন্ট করা যায়
public static void printList(List<?> list) {
for (Object element : list) {
System.out.println(element);
}
}
public static void main(String[] args) {
List<String> stringList = Arrays.asList("Apple", "Banana", "Mango");
List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5);
printList(stringList);
printList(intList);
}
}
উপরের উদাহরণে, <?> ব্যবহার করে আমরা যেকোনো টাইপের লিস্ট প্রিন্ট করতে পারছি।
আউটপুট:
Apple
Banana
Mango
1
2
3
4
5
import java.util.List;
public class UpperBoundedWildcardExample {
// Upper Bounded Wildcard যা শুধুমাত্র Number এর সাবটাইপ গ্রহণ করে
public static void printNumbers(List<? extends Number> list) {
for (Number number : list) {
System.out.println(number);
}
}
public static void main(String[] args) {
List<Integer> intList = Arrays.asList(1, 2, 3);
List<Double> doubleList = Arrays.asList(1.1, 2.2, 3.3);
printNumbers(intList);
printNumbers(doubleList);
}
}
এই উদাহরণে, <? extends Number> ব্যবহার করে শুধুমাত্র Number এর সাবটাইপগুলোকে প্রিন্ট করা হচ্ছে।
আউটপুট:
1
2
3
1.1
2.2
3.3
import java.util.List;
import java.util.ArrayList;
public class LowerBoundedWildcardExample {
// Lower Bounded Wildcard যা শুধুমাত্র Integer এবং এর সুপারটাইপ গ্রহণ করে
public static void addNumbers(List<? super Integer> list) {
for (int i = 1; i <= 5; i++) {
list.add(i);
}
}
public static void main(String[] args) {
List<Number> numberList = new ArrayList<>();
addNumbers(numberList);
System.out.println(numberList);
}
}
এই উদাহরণে, <? super Integer> ব্যবহার করে শুধুমাত্র Integer এবং তার সুপারক্লাসের টাইপের জন্য কাজ করা হয়েছে।
আউটপুট:
[1, 2, 3, 4, 5]
Java Generics ডেভেলপারদের জন্য টাইপ সেফ কোড লিখতে সহায়তা করে এবং একই কোডকে বিভিন্ন টাইপের ডেটার জন্য পুনর্ব্যবহারযোগ্য করে তোলে। Generics ব্যবহার করলে runtime errors এর সম্ভাবনা কমে যায় এবং কোডের রিডেবিলিটি ও মেইনটেনেন্স বাড়ে। Generics এর মাধ্যমে ডেভেলপাররা একটি ক্লাস বা মেথড একাধিক টাইপের জন্য ব্যবহার করতে পারেন, যার ফলে কোড আরও কার্যকর এবং সংক্ষিপ্ত হয়।
আপনি আমাকে যেকোনো প্রশ্ন করতে পারেন, যেমনঃ
Are you sure to start over?