Generics এর মধ্যে Restrictions এবং Limitations

জাভা জেনেরিক্স (Java Generics) - Java Technologies

308

জাভার জেনেরিক্স টাইপ-সেফটি এবং কোড পুনঃব্যবহারযোগ্যতার সুবিধা প্রদান করে। তবে জেনেরিক্স ব্যবহারে কিছু Restrictions (নিয়ম) এবং Limitations (সীমাবদ্ধতা) রয়েছে। এদের মূল কারণ হলো Type Erasure— জেনেরিক্সের কম্পাইল-টাইম টাইপ তথ্য Runtime-এ মুছে ফেলা হয়।


Restrictions এবং Limitations

1. Primitive Types ব্যবহার করা যায় না

জাভার জেনেরিক্স সরাসরি Primitive Types (যেমন int, double, boolean) সমর্থন করে না।

কারণ: জেনেরিক্স শুধুমাত্র Object টাইপের সঙ্গে কাজ করে।

উদাহরণ (সঠিক নয়):

List<int> list = new ArrayList<>(); // Compile-time error

সমাধান: Wrapper Classes (Integer, Double, ইত্যাদি) ব্যবহার করতে হবে।

List<Integer> list = new ArrayList<>();
list.add(10); // Autoboxing happens automatically

2. Runtime-এ Type Information নেই (Type Erasure)

Runtime-এ জেনেরিক টাইপ সম্পর্কিত তথ্য মুছে যায়, ফলে টাইপ চেকিং শুধুমাত্র Compile-Time-এ হয়।

উদাহরণ:

List<String> stringList = new ArrayList<>();
List<Integer> intList = new ArrayList<>();

// At runtime, both are treated as ArrayList
if (stringList.getClass() == intList.getClass()) {
    System.out.println("Both are of the same type");
}

আউটপুট:

Both are of the same type

3. Static Context-এ জেনেরিক টাইপ ব্যবহার করা যায় না

জেনেরিক টাইপ Static Fields, Static Methods, বা Static Blocks-এ ব্যবহার করা যায় না কারণ জেনেরিক টাইপটি নির্দিষ্ট টাইপ ইনস্ট্যান্সের উপর নির্ভরশীল।

উদাহরণ (সঠিক নয়):

public class GenericClass<T> {
    private static T instance; // Compile-time error
}

কারণ: Static মেম্বার একটি নির্দিষ্ট টাইপ ইনস্ট্যান্সের সাথে সংযুক্ত নয়।


4. Array of Generics তৈরি করা যায় না

জেনেরিক টাইপ ব্যবহার করে সরাসরি Array তৈরি করা যায় না।

উদাহরণ (সঠিক নয়):

List<String>[] listArray = new ArrayList<String>[10]; // Compile-time error

সমাধান: Collections Framework ব্যবহার করতে পারেন।

List<List<String>> listArray = new ArrayList<>();

5. Instanceof অপারেটরে Generics ব্যবহার করা যায় না

জেনেরিক টাইপ instanceof অপারেটরে সরাসরি ব্যবহার করা যায় না কারণ Runtime-এ টাইপ তথ্য উপলব্ধ থাকে না।

উদাহরণ (সঠিক নয়):

if (obj instanceof List<String>) { // Compile-time error
    // Do something
}

সমাধান: Raw টাইপ ব্যবহার করুন বা টাইপ চেক করুন।

if (obj instanceof List<?>) {
    System.out.println("This is a List");
}

6. Generic Exception তৈরি করা যায় না

জেনেরিক ক্লাস বা মেথড ব্যবহার করে কাস্টম এক্সেপশন তৈরি করা যায় না।

উদাহরণ (সঠিক নয়):

public class GenericException<T> extends Exception { // Compile-time error
}

কারণ: Exception handling টাইমে টাইপ ইনফরমেশন থাকে না।


7. Subclassing এবং Overloading এর সীমাবদ্ধতা

জেনেরিক ক্লাসের ক্ষেত্রে Type Erasure এর কারণে Subclassing এবং Method Overloading সমস্যাযুক্ত হতে পারে।

উদাহরণ:

class GenericClass<T> {
    void method(T t) {}
}

class SubClass extends GenericClass<String> {
    // SubClass এর method একই দেখাবে GenericClass<T> এর মতো
}

8. Generic Types এর ডিরেক্ট টাইপ ক্যাপচার সম্ভব নয়

জেনেরিক টাইপের ডেটা সরাসরি Reflection বা Runtime-এ ক্যাপচার করা যায় না।

উদাহরণ:

List<String> list = new ArrayList<>();
System.out.println(list.getClass()); // Output: class java.util.ArrayList

এখানে List<String> এবং List<Integer> এর ক্লাস একই ArrayList হবে।


জাভার জেনেরিক্সের কিছু সীমাবদ্ধতা থাকলেও এটি টাইপ সেফ এবং পুনঃব্যবহারযোগ্য কোড তৈরিতে অপরিহার্য।

Summary of Limitations:

সীমাবদ্ধতাকারণসমাধান
Primitive Types সমর্থিত নয়Generics শুধুমাত্র Objects এর সাথে কাজ করেWrapper Classes ব্যবহার করুন
Runtime-এ Type Information নেইType ErasureRaw টাইপ বা Wildcards ব্যবহার করুন
Static Context-এ Generics অযোগ্যStatic মেম্বার টাইপ ইনস্ট্যান্স নির্ভর নয়Static মেম্বার জেনেরিক থেকে আলাদা রাখুন
Array of Generics তৈরি করা যায় নাType ErasureCollections ব্যবহার করুন
Generic Exception নিষিদ্ধType ErasureRaw Exceptions ব্যবহার করুন

এগুলি মাথায় রেখে, সঠিক ব্যবহার ও পরিকল্পনা করে জেনেরিক্সের সীমাবদ্ধতাগুলো সহজে মোকাবিলা করা যায়।

Content added By

Primitive Types কেন Generics এ ব্যবহার করা যায় না?

325

জাভা জেনেরিক্স একটি Type Erasure ভিত্তিক প্রযুক্তি, যার কারণে এটি শুধুমাত্র Reference Types সমর্থন করে। তবে জাভার Primitive Types (যেমন int, double, boolean) একটি বিশেষ ধরনের টাইপ যা জেনেরিক্সে সরাসরি ব্যবহার করা যায় না। নিচে এর কারণ এবং সম্ভাব্য সমাধানগুলো ব্যাখ্যা করা হয়েছে।


Primitive Types কী?

Primitive Types জাভার বেসিক ডেটা টাইপ যেমন:

  • byte, short, int, long
  • float, double
  • char, boolean

এগুলো মেমোরি এবং প্রসেসিংয়ে আরো দক্ষ, কারণ এগুলো সরাসরি স্ট্যাক বা মেমোরিতে সংরক্ষিত হয় এবং কোনো অতিরিক্ত রেফারেন্স তৈরি করে না।


Generics কেন Primitive Types সমর্থন করে না?

১. Type Erasure এর কারণে

জাভা জেনেরিক্স কম্পাইল-টাইমে টাইপ চেকিং করে এবং রUNTIME-এর জন্য টাইপ তথ্য মুছে ফেলে। এটি Type Erasure নামে পরিচিত।

যখন জেনেরিক্স কম্পাইল হয়, তখন:

  • টাইপ প্যারামিটার একটি Reference Type (যেমন Object বা নির্দিষ্ট ক্লাস) হিসেবে প্রতিস্থাপিত হয়।
  • Primitive Types সরাসরি Object-এ রূপান্তরিত করা যায় না, কারণ এটি Reference Type নয়।

উদাহরণ:

List<Integer> list = new ArrayList<>();
list.add(10);  // Autoboxing occurs: int -> Integer

কম্পাইল-পরবর্তী কোড:

List list = new ArrayList();
list.add(Integer.valueOf(10)); // Integer টাইপ যোগ করা হয়।

২. Autoboxing/Unboxing প্রক্রিয়া

Primitive Types জেনেরিক্সে ব্যবহারের জন্য Autoboxing এবং Unboxing প্রক্রিয়ার মাধ্যমে Wrapper Classes (যেমন Integer, Double) এ রূপান্তরিত হয়। এটি অতিরিক্ত ওভারহেড সৃষ্টি করে।


প্রতিবন্ধকতার উদাহরণ

১. Primitive Types সরাসরি ব্যবহার করা সম্ভব নয়:

List<int> list = new ArrayList<>(); // Compile-time Error: unexpected type

২. Wrapper Class দিয়ে কাজ:

List<Integer> list = new ArrayList<>();
list.add(10); // Autoboxing: int -> Integer
int value = list.get(0); // Unboxing: Integer -> int

Primitive Types সমর্থন করার জন্য বিকল্প উপায়

১. Autoboxing/Wrapper Classes ব্যবহার

Primitive Types এর জন্য জাভা প্রতিটি টাইপের একটি Wrapper Class প্রদান করে:

  • intInteger
  • doubleDouble
  • booleanBoolean

উদাহরণ:

List<Integer> numbers = new ArrayList<>();
numbers.add(5);        // Autoboxing
int num = numbers.get(0); // Unboxing
System.out.println(num);

২. Specialized Collections (Apache Commons, Trove Libraries)

কিছু থার্ড-পার্টি লাইব্রেরি Primitive Types এর জন্য Collections প্রদান করে:

  • Apache Commons Primitives
  • Trove Library
TIntArrayList intList = new TIntArrayList();
intList.add(10);
int value = intList.get(0);
System.out.println(value);

৩. Primitive Arrays

যদি খুব বেশি ওভারহেড এড়াতে চান, তাহলে int[], double[] ইত্যাদি ব্যবহার করতে পারেন।

int[] arr = {1, 2, 3, 4};
for (int num : arr) {
    System.out.println(num);
}

Generics এ Primitive Types ব্যবহারের সমস্যার সমাধান

Java 10 বা তার পরবর্তী ভার্সনে Project Valhalla এর মাধ্যমে জেনেরিক্স Primitive Types সমর্থন করবে। এটি টাইপ প্যারামিটারের জন্য প্রিমিটিভ এবং রেফারেন্স টাইপ উভয়কেই সমর্থন করবে।


  • জাভা জেনেরিক্স শুধুমাত্র Reference Types সমর্থন করে, কারণ এটি Type Erasure পদ্ধতিতে কাজ করে।
  • Primitive Types ব্যবহারের জন্য Autoboxing/Unboxing প্রক্রিয়া এবং Wrapper Classes ব্যবহার করতে হয়।
  • Performance-সচেতন প্রজেক্টে Primitive Arrays বা থার্ড-পার্টি লাইব্রেরি ব্যবহার করা যেতে পারে।
Content added By

Static Members এর মধ্যে Generics এর সীমাবদ্ধতা

323

জাভায় জেনেরিক্স ব্যবহারের সময়, Static Members এর ক্ষেত্রে কিছু নির্দিষ্ট সীমাবদ্ধতা রয়েছে। এর মূল কারণ হল জেনেরিক টাইপ প্যারামিটার T-এর সাথে স্ট্যাটিক মেম্বার সরাসরি কাজ করতে পারে না। এর পিছনের কারণ এবং উদাহরণসহ বিস্তারিত ব্যাখ্যা এখানে দেওয়া হলো।


সীমাবদ্ধতা:

  1. Static মেম্বাররা ক্লাসের সাথে শেয়ার করা হয়, টাইপের সাথে নয়:
    • জাভায় জেনেরিক্স Compile-Time টাইপ চেকিং এর মাধ্যমে কাজ করে। তবে, Type Erasure-এর কারণে রানটাইমে জেনেরিক টাইপ সম্পর্কিত তথ্য মুছে যায়।
    • Static মেম্বার ক্লাসের সাথে যুক্ত থাকে, তাই এটি জেনেরিক টাইপ প্যারামিটার T-এর ওপর নির্ভর করতে পারে না।
  2. Static মেথডে জেনেরিক টাইপ ডিক্লেয়ারেশন সম্ভব নয় (বাইন্ড করা প্যারামিটার ছাড়া):
    • Static মেথড ক্লাস লেভেলে কাজ করে এবং কোনো নির্দিষ্ট জেনেরিক টাইপ প্যারামিটারকে মেনে চলতে পারে না।

প্রধান উদাহরণ এবং সমস্যা:

উদাহরণ ১: Static ফিল্ডে জেনেরিক টাইপ ব্যবহার

public class GenericClass<T> {
    private static T staticField; // Compilation Error

    public static T getStaticField() {
        return staticField; // Compilation Error
    }
}

কেন এটি কাজ করে না?

  • T হল একটি জেনেরিক টাইপ প্যারামিটার যা ক্লাস ইনস্ট্যান্সের জন্য নির্ধারিত হয়।
  • Static ফিল্ড বা মেথড ক্লাস লেভেলে কাজ করে এবং ইনস্ট্যান্স-নির্দিষ্ট টাইপ প্যারামিটার T সম্পর্কে জানে না।

উদাহরণ ২: Static মেথডের মধ্যে জেনেরিক টাইপ

public class GenericClass<T> {
    public static void display(T data) { // Compilation Error
        System.out.println(data);
    }
}

সমাধান:

Static মেথডে জেনেরিক টাইপ ডিক্লেয়ার করতে চাইলে মেথড লেভেলে আলাদাভাবে টাইপ প্যারামিটার ঘোষণা করতে হবে।

public class GenericClass<T> {
    public static <U> void display(U data) {
        System.out.println(data);
    }
}

ব্যবহার:

public class Main {
    public static void main(String[] args) {
        GenericClass<String> genericObj = new GenericClass<>();
        GenericClass.display("Hello, Generics!"); // Output: Hello, Generics!
        GenericClass.display(100);               // Output: 100
    }
}

জেনেরিক্স ব্যবহারে স্ট্যাটিক মেম্বারদের জন্য অন্যান্য সীমাবদ্ধতা

  1. Static Initializer বা Static ব্লকে জেনেরিক টাইপ ব্যবহার সম্ভব নয়:

    public class GenericClass<T> {
        static {
            T instance; // Compilation Error
        }
    }
    
  2. Static Nested ক্লাসে জেনেরিক টাইপ ব্যবহার সম্ভব নয়:

    public class GenericClass<T> {
        static class StaticNestedClass {
            T data; // Compilation Error
        }
    }
    

স্ট্যাটিক মেম্বারে জেনেরিক্স ব্যবহার করার বিকল্প পদ্ধতি

  1. Raw Types বা Non-Generic Approach: যদি জেনেরিক্স প্রয়োজন না হয়, তাহলে raw types ব্যবহার করা যেতে পারে। তবে, এটি টাইপ-সেইফ নয় এবং ClassCastException ঘটতে পারে।

    public class GenericClass<T> {
        private static Object data;
    
        public static void setStaticData(Object obj) {
            data = obj;
        }
    
        public static Object getStaticData() {
            return data;
        }
    }
    
  2. Static মেথডে আলাদা টাইপ প্যারামিটার ব্যবহার:

    public class GenericClass<T> {
        public static <U> void staticGenericMethod(U data) {
            System.out.println("Static Generic Data: " + data);
        }
    }
    
  3. Generic Singleton Pattern:

    public class Singleton<T> {
        private static final Singleton<?> INSTANCE = new Singleton<>();
    
        private Singleton() {}
    
        @SuppressWarnings("unchecked")
        public static <T> Singleton<T> getInstance() {
            return (Singleton<T>) INSTANCE;
        }
    }
    

    ব্যবহার:

    public class Main {
        public static void main(String[] args) {
            Singleton<String> stringInstance = Singleton.getInstance();
            Singleton<Integer> integerInstance = Singleton.getInstance();
            System.out.println(stringInstance == integerInstance); // Output: true
        }
    }
    

  1. সীমাবদ্ধতা:
    • Static মেম্বারে জেনেরিক টাইপ প্যারামিটার সরাসরি ব্যবহার করা যায় না।
    • Static ব্লক বা Static Nested ক্লাস জেনেরিক টাইপ সমর্থন করে না।
  2. সমাধান:
    • Static মেথডে আলাদা জেনেরিক টাইপ ডিক্লেয়ারেশন ব্যবহার করতে হবে।
    • টাইপ প্যারামিটার প্রয়োজন হলে নন-জেনেরিক পদ্ধতি বা বিকল্প ডিজাইন প্যাটার্ন ব্যবহার করা যেতে পারে।
  3. সতর্কতা:
    • Raw টাইপ ব্যবহার করলে টাইপ সেফটি হারাতে পারেন। তাই যতটা সম্ভব টাইপ সেফ পদ্ধতি ব্যবহার করা উচিত।
Content added By

instanceof এবং Generic Type Checking

289

জাভায় instanceof অপারেটর সাধারণত একটি অবজেক্ট নির্দিষ্ট টাইপের কিনা তা পরীক্ষা করতে ব্যবহৃত হয়। তবে, জেনেরিক্স ব্যবহার করার সময় Type Erasure-এর কারণে কিছু সীমাবদ্ধতা থাকে। এই প্রবন্ধে আমরা instanceof অপারেটর এবং Generic Type Checking এর কার্যপদ্ধতি ব্যাখ্যা করব।


Type Erasure এবং Generic Type Checking

জেনেরিক্স জাভার কম্পাইল-টাইমে কাজ করে, কিন্তু Runtime-এ জাভার টাইপ প্যারামিটার সম্পর্কিত তথ্য মুছে (erase) ফেলে। এর ফলে:

  1. Runtime-এ জেনেরিক টাইপ সম্পর্কে সরাসরি জানা যায় না।
  2. instanceof দিয়ে সরাসরি জেনেরিক টাইপ পরীক্ষা করা যায় না।

উদাহরণ:

List<String> stringList = new ArrayList<>();
if (stringList instanceof List<String>) { // Compile-time Error
    System.out.println("This is a List of Strings");
}

উপরের কোডটি Compile-time Error দেবে কারণ List<String> টাইপটি Runtime-এ উপলব্ধ নয়।


Type Checking এর সমাধান

১. Raw Type ব্যবহার করে instanceof পরীক্ষা

Runtime-এ জেনেরিক টাইপের পরিবর্তে raw type ব্যবহার করা যায়।

import java.util.List;
import java.util.ArrayList;

public class InstanceOfExample {
    public static void main(String[] args) {
        List<String> stringList = new ArrayList<>();

        if (stringList instanceof List) { // Checks against raw type
            System.out.println("This is a List");
        }
    }
}

আউটপুট:

This is a List

দ্রষ্টব্য: এটি কাজ করে, কিন্তু টাইপের বিশুদ্ধতা নিশ্চিত করতে পারে না। এটি শুধু যাচাই করে যে এটি একটি List কিনা।


২. ক্লাস টোকেন (Class<T>) দিয়ে টাইপ পরীক্ষা করা

Class অবজেক্ট ব্যবহার করে নির্দিষ্ট টাইপ চেক করা যায়। এটি সাধারণত জেনেরিক মেথড বা ক্লাসে ব্যবহৃত হয়।

import java.util.List;
import java.util.ArrayList;

public class TypeCheckWithClass {
    public static <T> boolean isInstanceOfType(Object obj, Class<T> clazz) {
        return clazz.isInstance(obj);
    }

    public static void main(String[] args) {
        List<String> stringList = new ArrayList<>();

        System.out.println(isInstanceOfType(stringList, List.class)); // true
        System.out.println(isInstanceOfType(stringList, ArrayList.class)); // true
    }
}

আউটপুট:

true
true

Wildcard ব্যবহার করে Generic Type Checking

Wildcard (<?>) ব্যবহার করে জেনেরিক টাইপ চেক করা যায়, তবে এটি Runtime-এ নির্দিষ্ট টাইপ চেক নিশ্চিত করে না।

import java.util.ArrayList;
import java.util.List;

public class WildcardInstanceCheck {
    public static void main(String[] args) {
        List<String> stringList = new ArrayList<>();
        List<Integer> intList = new ArrayList<>();

        if (stringList instanceof List<?>) { // Valid
            System.out.println("stringList is an instance of List<?>");
        }

        if (intList instanceof List<?>) { // Valid
            System.out.println("intList is an instance of List<?>");
        }
    }
}

আউটপুট:

stringList is an instance of List<?>
intList is an instance of List<?>

Generic Type Checking ইন্টারফেস বা মেথডে

উদাহরণ ১: টাইপ টেস্টিং মেথড

import java.util.List;

public class GenericTypeChecker {
    public static <T> boolean checkType(Object obj, Class<T> type) {
        return type.isInstance(obj);
    }

    public static void main(String[] args) {
        List<String> stringList = List.of("A", "B", "C");

        System.out.println(checkType(stringList, List.class)); // true
        System.out.println(checkType("Test", String.class));  // true
        System.out.println(checkType(123, String.class));     // false
    }
}

আউটপুট:

true
true
false

সীমাবদ্ধতা এবং পরামর্শ

  1. Type Erasure-এর কারণে সরাসরি Generic Type চেক করা যায় না।
    • <T> Runtime-এ কনভার্ট হয়ে raw type-এ পরিণত হয়।
  2. instanceof raw type-এ কাজ করে, কিন্তু নির্দিষ্ট টাইপ পরীক্ষা করতে পারে না।
  3. Type Token বা Class Object ব্যবহার করা জেনেরিক টাইপ চেকের সবচেয়ে কার্যকর উপায়।
  4. Wildcard (<?>) নির্দিষ্ট টাইপ না জানিয়ে Generic Collection চেক করতে ব্যবহার করা যেতে পারে।

জাভার জেনেরিক্সে instanceof এর সীমাবদ্ধতাগুলো Type Erasure-এর কারণে হয়। নির্দিষ্ট টাইপ চেক করার জন্য Class Object বা Wildcards ব্যবহার করা উত্তম পদ্ধতি। এটি টাইপ সেফ কোড নিশ্চিত করার পাশাপাশি Runtime-এ টাইপ মিসম্যাচের ঝুঁকি হ্রাস করে।

Content added By

Generic Array Creation এর সীমাবদ্ধতা

310

জাভায় জেনেরিক্স একটি শক্তিশালী ফিচার যা টাইপ-সেইফ কোড লিখতে সাহায্য করে। তবে, জেনেরিক্স ব্যবহার করার সময় নির্দিষ্ট কিছু সীমাবদ্ধতা রয়েছে, যার মধ্যে অন্যতম হলো Generic Array Creation


Generic Array Creation কেন সীমাবদ্ধ?

জাভার Type Erasure মেকানিজমের কারণে জেনেরিক অ্যারের টাইপ ইনফরমেশন রানটাইমে মুছে যায়। এটি একটি টাইপ সেফটি ইস্যু তৈরি করতে পারে। জাভা এই কারণে জেনেরিক অ্যারে সরাসরি তৈরি করতে দেয় না।


সরাসরি Generic Array তৈরি করার চেষ্টা

public class GenericArrayExample<T> {
    private T[] array;

    public GenericArrayExample() {
        // Compilation Error: Generic array creation
        this.array = new T[10];
    }
}

কম্পাইলার ত্রুটি:

Generic array creation

কেন এটি নিষিদ্ধ?

  1. Type Erasure এর কারণে টাইপ ইনফরমেশন মুছে যায়: জেনেরিক্স টাইপ রানটাইমে মুছে ফেলা হয়, তাই অ্যারের সঠিক টাইপ চেক করা সম্ভব নয়।
  2. টাইপ-সেইফটি সমস্যার ঝুঁকি: যদি জেনেরিক অ্যারে তৈরি করা সম্ভব হতো, তাহলে টাইপ ইনফরমেশন রানটাইমে চেক না করে ভুল টাইপ ইনসার্ট করা যেত।

    উদাহরণ:

    Object[] objArray = new String[10]; // Allowed because of covariance
    objArray[0] = 10; // No error at compile-time, but throws ArrayStoreException at runtime
    

সমাধান এবং বিকল্প পদ্ধতি

1. Generic Collection ব্যবহার

Generic Collection (যেমন: ArrayList) অ্যারের বিকল্প হিসেবে ব্যবহার করা যেতে পারে। এটি টাইপ সেফ এবং সহজেই ব্যবস্থাপনা করা যায়।

import java.util.ArrayList;
import java.util.List;

public class GenericCollectionExample<T> {
    private List<T> list;

    public GenericCollectionExample() {
        this.list = new ArrayList<>();
    }

    public void add(T element) {
        list.add(element);
    }

    public T get(int index) {
        return list.get(index);
    }
}

2. Object Array তৈরি এবং কাস্টিং

Generic Array তৈরি করতে Object Array ব্যবহার করা যেতে পারে এবং টাইপ সেফটি নিশ্চিত করার জন্য কাস্টিং করা যেতে পারে।

public class GenericArrayExample<T> {
    private T[] array;

    @SuppressWarnings("unchecked")
    public GenericArrayExample(int size) {
        this.array = (T[]) new Object[size]; // Casting Object[] to T[]
    }

    public void set(int index, T value) {
        array[index] = value;
    }

    public T get(int index) {
        return array[index];
    }
}

ব্যবহার:

public class Main {
    public static void main(String[] args) {
        GenericArrayExample<String> genericArray = new GenericArrayExample<>(5);
        genericArray.set(0, "Hello");
        genericArray.set(1, "World");

        System.out.println(genericArray.get(0)); // Output: Hello
        System.out.println(genericArray.get(1)); // Output: World
    }
}

3. Reflection API ব্যবহার

Reflection API ব্যবহার করে জেনেরিক অ্যারে তৈরি করা যায়।

import java.lang.reflect.Array;

public class GenericArrayExample<T> {
    private T[] array;

    public GenericArrayExample(Class<T> clazz, int size) {
        this.array = (T[]) Array.newInstance(clazz, size);
    }

    public void set(int index, T value) {
        array[index] = value;
    }

    public T get(int index) {
        return array[index];
    }
}

ব্যবহার:

public class Main {
    public static void main(String[] args) {
        GenericArrayExample<String> genericArray = new GenericArrayExample<>(String.class, 5);
        genericArray.set(0, "Hello");
        genericArray.set(1, "World");

        System.out.println(genericArray.get(0)); // Output: Hello
        System.out.println(genericArray.get(1)); // Output: World
    }
}

Generic Array Creation-এর প্রধান সীমাবদ্ধতা সারাংশ

সীমাবদ্ধতাকারণ
সরাসরি Generic Array তৈরি করা যায় নাType Erasure এর কারণে টাইপ ইনফরমেশন রানটাইমে মুছে যায়।
টাইপ সেফটি নিশ্চিত করা কঠিনরানটাইমে টাইপ মিসম্যাচের কারণে সমস্যা তৈরি হতে পারে।
Array এবং জেনেরিক্সের কভেরিয়েন্স (Covariance)অ্যারে কভেরিয়েন্স এবং জেনেরিক্স ইনভারিয়েন্স টাইপ কনফ্লিক্ট করে।

Generic Array Creation-এর সীমাবদ্ধতা থাকা সত্ত্বেও, Generic Collection এবং বিকল্প পদ্ধতিগুলো ব্যবহার করে এই সমস্যা সমাধান করা যায়। টাইপ-সেইফটি নিশ্চিত করতে এই সীমাবদ্ধতা ডিজাইন করা হয়েছে, যা বড় আকারের প্রজেক্টে বাগ-মুক্ত এবং কার্যকরী কোড লেখার জন্য গুরুত্বপূর্ণ।

Content added By
Promotion

Are you sure to start over?

Loading...