首页 > 解决方案 > 如何将未知的类类型发送到方法并为该类生成参数

问题描述

我想将一个 Java 类发送到一个方法并在 arg 中接收它,该类与我发送的类的类型相同,每次调用此方法时,我都会向它发送一个新类。

示例:这是我创建的类中的方法,并且有一种泛型 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);

希望我能解释我遇到的问题非常感谢!

标签: javaandroidclassoopgenerics

解决方案


您需要做的是创建一个 BaseAdapter :

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

然后您需要修改您的方法以仅接受扩展您的 BaseAdapter 的泛型:

<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);

推荐阅读