Как я могу отправить неизвестный тип класса в метод и сгенерировать параметр для этого класса

#java #android #class #oop #generics

#java #Android #класс #ооп #общие сведения

Вопрос:

Я хочу отправить класс Java в метод и получить его в аргументе, который содержит тот же тип класса, который я отправил, и каждый раз, когда я вызываю этот метод, у меня есть новый класс, который я отправляю ему.

Пример: это метод в классе, который я создал, и есть тип generic T, но этот метод, который я пробовал, не работает

 <T> void getBedInfo(final RecyclerView MainRecycler, Class<T> adapterName){

    BedInfoGetter.addSnapshotListener(this, new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(@javax.annotation.Nullable QuerySnapshot queryDocumentSnapshots, @javax.annotation.Nullable FirebaseFirestoreException e) {
            if(e!=null){
                return;
            }
            BedInfo.clear();
            for(QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
                Bed oneBedInfo = documentSnapshot.toObject(Bed.class);
                activeValue = documentSnapshot.getId();
                oneBedInfo.getId(activeValue);
                BedInfo.add(oneBedInfo);
            }
            Adpter=new Adpter(BedInfo, context, activity);
            MainRecycler.setAdapter(AOP);
            MainRecycler.setItemAnimator(new DefaultItemAnimator());
        }
    });
}
 

это вызов метода

 databaseHandler.getBedInfo(MainRecycler, AdapterOnePatient.class);
 

Надеюсь, я объясню проблему, которая у меня есть
Большое спасибо!

Комментарии:

1. для второго метода вы должны передать класс, а не строку, что-то вроде «String.class »

2. @Boukharist Спасибо за эту заметку о скриншотах, я перепробовал весь метод в виде строки, поскольку замечание о классе работает!!

3. для чего вам нужно «adaterName»? он не используется в вашем коде

4. Таким образом, я могу отправить класс, который я хочу сгенерировать, имейте в виду, что каждый раз, когда я буду отправлять другой тип класса, один раз databaseHandler.getBedInfo(MainRecycler, **AdapterOnePatient.class**); я отправлю так, во второй раз я отправлю параметры, подобные этому databaseHandler.getBedInfo(MainRecycler,**AdpterMainInterface.class**); . Я хочу, чтобы каждый раз, когда я вызываю метод, чтобы знать, какой тип класса я отправил ему, и генерировать типкласс ит @Boukharist

5. @Boukharist если то, что я прошу, сработает, я заменю строку новым классом, который я создал adapterName=new adapterName(BedInfo, context, activity);

Ответ №1:

Что вам нужно сделать, это создать BaseAdapter :

 class BaseAdapter {
    BaseAdapter(BedInfo info, Context context, Activity activity) {
        //...
    }
}
 

Затем вам нужно изменить свой метод, чтобы он принимал только обобщения, расширяющие ваш базовый адаптер :

 <T extends BaseAdapter> void getBedInfo(final Recycler recycler, Class<T> adapterName) {

    BedInfoGetter.addSnapshotListener(this, new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(QuerySnapshot queryDocumentSnapshots, FirebaseFirestoreException e) {
            if (e != null) {
                return;
            }
            BedInfo.clear();
            for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
                Bed oneBedInfo = documentSnapshot.toObject(Bed.class);
                activeValue = documentSnapshot.getId();
                oneBedInfo.getId(activeValue);
                BedInfo.add(oneBedInfo);
            }
            T adapter = new BaseAdapter(info, context, activity);
            MainRecycler.setAdapter(adapter);
            MainRecycler.setItemAnimator(new DefaultItemAnimator());
        }
    });
}
 

И третий шаг — использовать его следующим образом :

 getBedInfo(recycler, AdapterOnePatient.class);
 

Комментарии:

1. Так что это похоже на создание полиморфизма, это имеет смысл, я попробую, спасибо, чувак!