[英]Passing generic classes and objects to a Java method
我想用泛型替換以下內容:
for (Post post : postResponse.getResults()) {
,其中Post
可以是任何POJO。 List<Post> posts = postResponse.getResults();
其中List<Post>
可以是我傳入的所有內容的列表。 我的方法調用和方法主體是什么樣的?
方法調用的不同示例:
retrieveData(mCardAdapter, new Post(), Post.class);
retrieveData(mCardAdapter, new Contact(), Contact.class);
retrieveData(mCardAdapter, new Product(), Product.class);
retrieveData(mCardAdapter, new Booking(), Booking.class);
方法:
private void retrieveData(final CardAdapter mCardAdapter, final Object<T> postObject, Class<T> postClass) {
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 (postObject post : postResponse.getResults()) {
Log.e("RetrofitService", post.getObjectId() + ": " + post.getText());
}
setRefreshingFalse();
mCardAdapter.clear();
List<postClass> posts = postResponse.getResults();
mCardAdapter.addData(posts);
} else {
Log.e("RetrofitService", "Object returned is null.");
}
}
});
}
我正在獲得Unknown class: 'tClass'
和Unknown class: 'postClass'
。 顯然,這不是做到這一點的方法,因此也許將我上面顯示的內容視為pseduo代碼。 我要做什么有意義嗎? 我真的想泛型化這個retrieveData
方法,以便我可以用於查詢不同的類。
幫助理解。 我要避免的是:
retrievePosts(mCardAdapter);
retrieveUsers(mCardAdapter);
private void retrievePosts(final CardAdapter mCardAdapter) {
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 post : postResponse.getResults()) {
Log.e("RetrofitService", post.getObjectId() + ": " + post.getText());
}
/*for (Post post : postResponse.getResults()) {
mCardAdapter.addData(post);
}*/
setRefreshingFalse();
mCardAdapter.clear();
List<Post> posts = postResponse.getResults();
mCardAdapter.addData(posts);
} else {
Log.e("RetrofitService", "Object returned is null.");
}
}
});
}
private void retrieveUsers(final CardAdapter mCardAdapter) {
RetrofitService service = ServiceFactory.createRetrofitService(RetrofitService.class, RetrofitService.SERVICE_ENDPOINT);
service.getUsers()
.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 (User user : userResponse.getResults()) {
Log.e("RetrofitService", user.getObjectId() + ": " + user.getText());
}
/*for (Post post : postResponse.getResults()) {
mCardAdapter.addData(post);
}*/
setRefreshingFalse();
mCardAdapter.clear();
List<User> users = userResponse.getResults();
mCardAdapter.addData(users);
} else {
Log.e("RetrofitService", "Object returned is null.");
}
}
});
}
如果我正確理解了您的問題,則希望對不同的類使用通用方法。 我沒有看到您在列表中添加了某些內容,因此這可能對您有用。
private <clazz> void retrieveData(final Class<?> clazz) {
for (clazz post : postResponse.getResults()) {
// you can't do anything here since clazz can be anything
}
List<clazz> posts = postResponse.getResults();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.