#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**);
. Я хочу, чтобы каждый раз, когда я вызываю метод, чтобы знать, какой тип класса я отправил ему, и генерировать типкласс ит @Boukharist5. @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. Так что это похоже на создание полиморфизма, это имеет смысл, я попробую, спасибо, чувак!