Tôi đang cố gắng tạo trình bao bọc trên Retrofit
để trừu tượng triển khai dịch vụ của mình. Tôi đã nhận được biên dịch để biên dịch thành công cho đến nay:Chuyển lớp lồng nhau <MyInterface <T>> làm tham số trong Android
package com.example.spark.testapp.services;
import com.example.spark.testapp.services.apis.Get;
import com.example.spark.testapp.services.apis.Post;
import com.example.spark.testapp.services.utils.*;
import com.example.spark.testapp.services.utils.Error;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class ServiceLayer {
public <T> void performGet(String url, final Class<Get<T>> clazz, com.example.spark.testapp.services.utils.Callback<T> callback) {
Retrofit retrofit = new Retrofit.Builder().baseUrl("").build();
Get<T> service = retrofit.create(clazz);
//Pass authentication token here
Call<T> t = service.get(url, "");
executeCallback(callback,t);
}
public <T> void performPost(String url, final Class<Post<T>> clazz,com.example.spark.testapp.services.utils.Callback<T> callback) {
Retrofit retrofit = new Retrofit.Builder().baseUrl("").build();
Post<T> service = retrofit.create(clazz);
//Pass authentication token here
Call<T> t = service.post(url, "");
executeCallback(callback,t);
}
public <T> void executeCallback(final com.example.spark.testapp.services.utils.Callback<T> callback , Call<T> call) {
call.enqueue(new Callback<T>() {
@Override
public void onResponse(Call<T> call, Response<T> response) {
callback.onSuccess(response.body());
}
@Override
public void onFailure(Call<T> call, Throwable t) {
///Find out what exactly went wrong. Populate Error. and then...
com.example.spark.testapp.services.utils.Error e = new Error();
callback.onFailure(e);
}
});
}
}
Trong khi điều này biên dịch, vấn đề là tại thời điểm gọi phương thức:
private void getString() {
ServiceLayer s = new ServiceLayer();
s.performGet("",Get<String>.class,this); //Cannot select from parameterised type
}
Tôi đã google xung quanh này một chút và phát hiện ra rằng điều này là không thể do loại tẩy xoá. Khỏe.
Nhưng câu hỏi của tôi là, trình biên dịch có nên nêu ra lỗi ở đây không? Tại dòng này? :
public <T> void performGet(String url, final Class<Get<T>> clazz, com.example.spark.testapp.services.utils.Callback<T> callback)
Lớp dịch vụ của tôi được biên dịch như thế nào?
EDIT
Câu hỏi đặt ra dường như bị hiểu lầm. Tôi không tìm cách để thiết kế này hoạt động. Tôi hiểu lỗ hổng trong đó và chúng tôi đã tìm thấy một cách tốt hơn để lớp dịch vụ của mình. Câu hỏi đặt ra là về hành vi thú vị/kỳ lạ của chính ngôn ngữ đó.
Tôi giả định 'this' thực hiện 'Gọi lại'? –
njzk2
có liên quan: http://stackoverflow.com/questions/27000227/cannot-select-parameterized-type – njzk2
@ njk2 - Có. Bạn đúng rồi. 'this' thực hiện gọi lại. Và nó không liên quan chút nào. Câu hỏi đặt ra là, lớp dịch vụ của tôi được biên dịch như thế nào nếu bạn không thể gọi nó? –
avismara