সুরক্ষা সংরক্ষণের সময় আপনি যে ধরণের সন্ধান করছেন ঠিক তার ধরণের অ্যারে পেতে জেনেরিকগুলি কীভাবে ব্যবহার করবেন তা এখানে রয়েছে (অন্য উত্তরের বিপরীতে, যা আপনাকে 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));
}