সুরক্ষা সংরক্ষণের সময় আপনি যে ধরণের সন্ধান করছেন ঠিক তার ধরণের অ্যারে পেতে জেনেরিকগুলি কীভাবে ব্যবহার করবেন তা এখানে রয়েছে (অন্য উত্তরের বিপরীতে, যা আপনাকে Objectসংকলনের সময় একটি অ্যারে ফিরিয়ে দেবে বা পরিণতিতে সতর্কবার্তার ফলস্বরূপ):
import java.lang.reflect.Array;
public class GenSet<E> {
private E[] a;
public GenSet(Class<E[]> clazz, int length) {
a = clazz.cast(Array.newInstance(clazz.getComponentType(), length));
}
public static void main(String[] args) {
GenSet<String> foo = new GenSet<String>(String[].class, 1);
String[] bar = foo.a;
foo.a[0] = "xyzzy";
String baz = foo.a[0];
}
}
এটি কোনও সতর্কতা ছাড়াই সংকলন করে এবং আপনি যেমন দেখতে পাচ্ছেন main, যে কোনও ধরণের জন্য আপনি GenSetযেমন উদাহরণ হিসাবে ঘোষণা করেন, আপনি aসেই ধরণের অ্যারেতে নির্ধারণ করতে পারেন এবং আপনি কোনও উপাদান নির্ধারণ করতে পারেনa সেই ধরণের একটি ভেরিয়েবলের , যার অর্থ অ্যারে এবং অ্যারের মানগুলি সঠিক ধরণের হয়।
এটি জাভা টিউটোরিয়ালে আলোচিত যেমন রানটাইম টাইপ টোকেন হিসাবে শ্রেণীর লিটারালগুলি ব্যবহার করে কাজ করে । ক্লাস লিটারালগুলির উদাহরণ হিসাবে সংকলক দ্বারা চিকিত্সা করা হয় java.lang.Class। একটি ব্যবহার করতে, সহ একটি শ্রেণীর নামটি অনুসরণ করুন .class। সুতরাং, শ্রেণীর প্রতিনিধিত্বকারী String.classএকটি Classউপাদান হিসাবে কাজ করে String। এই ইন্টারফেস, enums কোন-মাত্রিক অ্যারে (যেমন জন্য কাজ করে String[].class), প্রিমিটিভের (যেমন int.class), এবং শব্দ void(যেমনvoid.class ) ।
Class(হিসাবে ঘোষণা নিজেই জেনেরিক হয় Class<T>, যেখানে Tযে ধরনের ঘোরা Classবস্তু প্রতিনিধিত্বমূলক হয়), যার মানে হল ধরণ String.classহলClass<String> ।
সুতরাং, যখনই আপনার জন্য কন্সট্রাকটর কল GenSet, আপনাকে প্রথমে যুক্তি একটি অ্যারের প্রতিনিধিত্বমূলক জন্য একটি শ্রেণী আক্ষরিক মধ্যে পাস GenSetউদাহরণস্বরূপ এর ঘোষিত টাইপ (যেমন String[].classজন্য GenSet<String>)। নোট করুন যে আপনি আদিমগুলির একটি অ্যারে পেতে সক্ষম হবেন না, যেহেতু আদিমগুলি প্রকারের ভেরিয়েবলের জন্য ব্যবহার করা যায় না।
কনস্ট্রাক্টরের অভ্যন্তরে, পদ্ধতিকে কল করে সেই পদ্ধতিটি কল করা বস্তুর দ্বারা প্রতিনিধিত্ব করা শ্রেণিতে castপাস হওয়া Objectআর্গুমেন্টটি ফেরত দেয় Class। স্ট্যাটিক পদ্ধতি কলিং newInstanceমধ্যে java.lang.reflect.Arrayএকটি হিসাবে আয় Objectটাইপ দ্বারা উপস্থাপিত একটি অ্যারের Classবস্তু প্রথম আর্গুমেন্ট হিসাবে এবং দৈর্ঘ্য দ্বারা নির্দিষ্ট যা অতীত হয়ে intদ্বিতীয় আর্গুমেন্ট হিসাবে গৃহীত। পদ্ধতি কলিং getComponentTypeরিটার্ন একটি Classবস্তুর অ্যারের দ্বারা উপস্থাপিত উপাদান টাইপ প্রতিনিধিত্বমূলক Classবস্তুর উপর পদ্ধতি বলা হয় (যেমন String.classজন্য String[].class, nullযদিClass বস্তুর একটি অ্যারে প্রতিনিধিত্ব করে না)।
এই শেষ বাক্যটি সম্পূর্ণ সঠিক নয়। কলিং ক্লাসের প্রতিনিধিত্ব করে এমন String[].class.getComponentType()একটি Classবস্তু ফেরত দেয় Stringতবে এর ধরণটি Class<?>নয় Class<String>, তাই আপনি নীচের মতো কিছু করতে পারবেন না।
String foo = String[].class.getComponentType().cast("bar"); // won't compile
একইভাবে প্রতিটি পদ্ধতির জন্য যায় Classযা কোনও Classবস্তু দেয়।
এই উত্তরে জোয়াকিম সউরের মন্তব্য সম্পর্কে (নিজেই এ সম্পর্কে মন্তব্য করার মতো যথেষ্ট খ্যাতি আমার নেই), কাস্ট ব্যবহারের উদাহরণটি T[]একটি সতর্কবার্তা হিসাবে দেখাবে কারণ সংকলক সেই ক্ষেত্রে প্রকারের সুরক্ষার গ্যারান্টি দিতে পারে না।
ইনোগোর মন্তব্য সম্পর্কিত সম্পাদনা করুন:
public static <T> T[] newArray(Class<T[]> type, int size) {
return type.cast(Array.newInstance(type.getComponentType(), size));
}