将嵌套的Class <MyInterface <T >>作为Android中的参数传递

avi*_*ara 15 java generics android

我正在尝试创建一个包装器Retrofit来抽象我的服务实现.到目前为止,我已经成功编译了编译器:

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);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

在编译时,问题就在于调用方法:

private void getString() {

        ServiceLayer s = new ServiceLayer();
        s.performGet("",Get<String>.class,this); //Cannot select from parameterised type

    }
Run Code Online (Sandbox Code Playgroud)

我用Google搜索了一下,发现由于类型擦除,这是不可能的.精细.

但我的问题是,编译器不应该在这里引发错误吗?在这条线?:

public <T> void performGet(String url, final Class<Get<T>> clazz, com.example.spark.testapp.services.utils.Callback<T> callback) 
Run Code Online (Sandbox Code Playgroud)

我的服务层是如何编译的?

编辑

这个问题似乎被误解了.我不是在寻找一种方法来使这个设计工作.我理解其中的缺陷,我们找到了更好的方法来分层我们的服务.问题是关于语言本身的有趣/奇怪的行为.

Paw*_*.Ch 0

做了一些测试并找到了一些解决方案,希望对您有所帮助。

由于此代码返回 true(其中 A 是一些不执行任何操作的泛型类):

A<String> a = new A<String>();
System.out.println(A.class == a.getClass());
Run Code Online (Sandbox Code Playgroud)

这意味着您不需要获取“Get<T>”类,而只需“Get”即可进行改造

您需要的是将 T 作为另一个参数发送,以便函数知道这个 T 是什么,例如:

public <T> void performGet(String url, final Class<Get> clazz, final Class<T> t, com.example.spark.testapp.services.utils.Callback<T> callback) {
    Retrofit retrofit = new Retrofit.Builder().baseUrl("").build();
    Get<T> service = retrofit.create(clazz);
    ...
Run Code Online (Sandbox Code Playgroud)