Sobes.tech
Middle

როგორ შეიძლება განსაზღვრო გენერიკულ კლასში გამოყენებული პარამეტრის ტიპი პროგრამის შესრულების დროს?

sobes.tech AI

პასუხი AI-სგან

Java-ում, տիպերի ջնջումից (type erasure) պատճառով, գեներիկ դասերի պարամետրերի տիպերի մասին տեղեկատվությունը չի պահվում բայթկոդում, հետևաբար, այդ պարամետրի տիպը ուղիղ որոշել հնարավոր չէ գործարկման ժամանակ:

Այնուամենայնիվ, մի քանի եղանակներ կան, ինչպես ստանալ այդ տեղեկատվությունը:

  1. Օգտագործել TypeToken դասը կամ նման կառուցվածքներ: Գեներիկ դասի օրինակ ստեղծելիս, կարող եք փոխանցել Class<T> օբյեկտը կամ օգտագործել անանուն ենթակլաս, որպեսզի պահպանեք տիպի մասին տեղեկատվությունը:

  2. Ռեֆլեկցիա ParameterizedType-ի միջոցով: Եթե գեներիկ դասը պահում է տիպի մասին տեղեկատվությունը դաշտում կամ կոնստրուկտորում, այն կարելի է ստանալ ռեֆլեկցիայի միջոցով:

Օրինակ Class<T> փոխանցելով՝

public class GenericClass<T> {
    private Class<T> type;

    public GenericClass(Class<T> type) {
        this.type = type;
    }

    public void printType() {
        System.out.println("Պարամետրի տիպը՝ " + type.getName());
    }
}

GenericClass<String> instance = new GenericClass<>(String.class);
instance.printType(); // Տպում է՝ Պարամետրի տիպը՝ java.lang.String

Ահա, որ գործարկման ժամանակ պարամետրի տիպը որոշելու համար, սովորաբար անհրաժեշտ է այն փոխանցել կամ բացահայտորեն պահել, քանի որ Java-ի ստանդարտ մեխանիզմները դա թույլ չեն տալիս տիպերի ջնջման պատճառով.