වර්ගයේ ආරක්ෂාව ආරක්ෂා කරන අතරම ඔබ සොයන ආකාරයේ වර්ගයක් ලබා ගැනීම සඳහා ජනක විද්යාව භාවිතා කරන්නේ කෙසේද යන්න මෙන්න (අනෙක් පිළිතුරු වලට වඩා වෙනස්ව, එය ඔබට නැවත 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. මෙය අතුරුමුහුණත්, එනූම්ස්, ඕනෑම මාන අරා (උදා String[].class), ප්රාථමික (උදා int.class) සහ මූල පදය void(එනම් void.class) සඳහා ද ක්රියා කරයි.
Classම Generic බලපත්රය යටතේ අවසර ලබා ඇත වේ (ලෙස ප්රකාශයට පත් Class<T>කොහේද, Tබව වර්ගය සඳහා කි්රයා Classවර්ගය තේරුම වන්නේ, වස්තුවක් නියෝජනය), String.classයනු Class<String>.
ඒ නිසා, ඔබ වෙනුවෙන් ඉදිකිරීමටත් අයැදින GenSet, ඔබ රැසක් නියෝජනය කරන පළමු වාදය සඳහා පන්ති ප්රායෝගික සමත් GenSetඋදාහරණයක් ප්රකාශිත වර්ගය (උදා: String[].classසඳහා GenSet<String>). වර්ග විචල්යයන් සඳහා ප්රාථමිකයන් භාවිතා කළ නොහැකි බැවින් ඔබට ප්රාථමික පෙළක් ලබා ගත නොහැකි බව සලකන්න.
ඉදිකිරීම්කරු තුළ, ක්රමවේදය ඇමතීමෙන්, castසම්මත කරන ලද Objectතර්කය Class, ක්රමය හැඳින්වූ වස්තුව නියෝජනය කරන පන්තියට යවයි . පළමු තර්කය ලෙස සම්මත කරන ලද වස්තුව නියෝජනය කරන වර්ගයේ අරාව ලෙසත්, දෙවන තර්කය ලෙස සම්මත කළ නිශ්චිතව දක්වා ඇති දිගටත් newInstance, java.lang.reflect.Arrayප්රතිලාභවල ස්ථිතික ක්රමය ඇමතීම . මෙම ක්රමය ඉල්ලා ඇති නැවත විසින් නියෝජනය අරාව යන සංරචකය වර්ගය නියෝජනය වස්තුව (උදා: කරන ක්රමය ලෙස හැඳින්වූ වස්තුව සඳහා , නම්, වස්තුව රැසක් නියෝජනය වන්නේ නැත).ObjectClassintgetComponentTypeClassClassString.classString[].classnullClass
එම අවසාන වාක්යය සම්පූර්ණයෙන්ම නිවැරදි නොවේ. ඇමතීමෙන් පන්තිය නියෝජනය 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));
}