gpt4 book ai didi

java - 如何重构一个以未知类作为参数的方法?

转载 作者:行者123 更新时间:2023-12-02 12:22:17 24 4
gpt4 key购买 nike

我想让这个方法可重用,但我不确定如何提供在以下上下文中工作的参数:

  • service.getPosts() // The method called, i.e. getPosts() should vary depending on the class parameter
  • for (Post object : postResponse.getResults()) { // I want the Post class to come from the parameter
  • List<Post> objects = postResponse.getResults(); // I want the class passed into this list to also come from that same parameter
<小时/>

方法调用:

retrieveData(mCardAdapter, Post.class);

方法:

private void retrieveData(final CardAdapter mCardAdapter, final Class classParam) {
RetrofitService service = ServiceFactory.createRetrofitService(RetrofitService.class, RetrofitService.SERVICE_ENDPOINT);
service.getPosts()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<PostResponse>() {
@Override
public final void onCompleted() {
setRefreshingFalse();
Log.e("RetrofitService", "Retrofit Request Completed!");
}

@Override
public final void onError(Throwable e) {
setRefreshingFalse();
Log.e("RetrofitService", e.getMessage());
}

@Override
public final void onNext(PostResponse postResponse) {
if (postResponse != null) {
Log.e("RetrofitService", "Returned objects: " + postResponse.getResults());

for (Post object : postResponse.getResults()) {
Log.e("RetrofitService", object.getObjectId() + ": " + object.getText());
}

/*for (Post post : postResponse.getResults()) {
mCardAdapter.addData(post);
}*/

setRefreshingFalse();

mCardAdapter.clear();
List<Post> objects = postResponse.getResults();
mCardAdapter.addData(objects);

} else {
Log.e("RetrofitService", "Object returned is null.");
}

}

});
}

当我经过Class classParam时,我刚刚得到 Unkown class: 'classParam'作为一个错误。

服务:

public interface RetrofitService {

String SERVICE_ENDPOINT = "https://parseapi.back4app.com";

@Headers({
"X-Parse-Application-Id: asdf",
"X-Parse-REST-API-Key: asdf"
})
@GET("/classes/Post")
Observable<PostResponse> getPosts();

}

发布对象:

public class Post implements Serializable {

private static final String CLASS_NAME = "Post";

private String objectId;
private String text;

public Post() {
}

public String getClassName() {
return CLASS_NAME;
}

public String getObjectId() {
return objectId;
}

public void setObjectId(String objectId) {
this.objectId = objectId;
}

public String getText() {
return text;
}

public void setText(String text) {
this.text = text;
}

}

更新(根据罗马的建议):

enter image description here

enter image description here

最佳答案

您没有显示PostResponse代码,但我想它是这样的:

public class PostResponse {
private List<Post> results;

public List<Post> getResults() {
return results;
}

....
}

那么你可以做这样的事情。

首先,参数化Response (用来代替 PostResponse ):

public class Response<T> {
private List<T> results;

public List<T> getResults() {
return results;
}

....
}

其次,使用类型参数更改主方法签名:

private <T> void retrieveData(final CardAdapter mCardAdapter, final Class<T> classParam, DataSaver<T> saver) {
...
}

在你的 retrieveData() 里面您使用的方法 T而不是PostResponse<T>而不是PostResponse .

但你还必须处理

mCardAdapter.addData(objects);

在这里,简单类型参数化很可能不起作用。您必须使用最后一个参数( saver )将结果放入容器中:

saver.save(results);

在你的 saver 中您实际执行的实现

public void save(List<Post> posts) {
mCardAdapter.addData(posts);
}

DataSaver也将是通用的:

public interface DataSaver<T> {
void save(List<T> objects);
}

关于java - 如何重构一个以未知类作为参数的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45680923/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com