වර්ගයේ ආරක්ෂාව ආරක්ෂා කරන අතරම ඔබ සොයන ආකාරයේ වර්ගයක් ලබා ගැනීම සඳහා ජනක විද්යාව භාවිතා කරන්නේ කෙසේද යන්න මෙන්න (අනෙක් පිළිතුරු වලට වඩා වෙනස්ව, එය ඔබට නැවත 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
ප්රතිලාභවල ස්ථිතික ක්රමය ඇමතීම . මෙම ක්රමය ඉල්ලා ඇති නැවත විසින් නියෝජනය අරාව යන සංරචකය වර්ගය නියෝජනය වස්තුව (උදා: කරන ක්රමය ලෙස හැඳින්වූ වස්තුව සඳහා , නම්, වස්තුව රැසක් නියෝජනය වන්නේ නැත).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));
}