未经检查的调用方法作为原始类型的成员

时间:2017-11-01 07:14:03

标签: java android generics interface generic-interface

警告显示在我的项目中 -

未选中调用'getWeatherData(T,Boolean,String)'作为原始类型'IWeatherCallbackListener'的成员。

我创建了以下界面 -

public interface IWeatherCallbackListener<T> {
 void getWeatherData(T weatherModel, Boolean success, String errorMsg);
}

并按照以下方式调用它,

public class WeatherConditions {

private static IWeatherApi mWeatherApi;

/**
 * @param city
 * @param appId
 * @param listener
 */
public static void getOpenWeatherData(String city, String appId, IWeatherCallbackListener listener) {

    mWeatherApi = ApiService.getRetrofitInstance(BASE_URL_OPEN_WEATHER).create(IWeatherApi.class);
    Call<OpenWeatherModel> resForgotPasswordCall = mWeatherApi.getOpenWeatherData(appId, city);
    resForgotPasswordCall.enqueue(new Callback<OpenWeatherModel>() {
        @Override
        public void onResponse(Call<OpenWeatherModel> call, Response<OpenWeatherModel> response) {
            if (response.body() != null) {
                if (listener != null)
                    listener.getWeatherData(response.body(), true, "");
            }
        }

        @Override
        public void onFailure(Call<OpenWeatherModel> call, Throwable t) {
            if (listener != null)
                 listener.getWeatherData(null, false, t.getMessage());
        }
    });
}

我在MainActivity中实现了这个接口,并将该方法称为 -

WeatherConditions.getOpenWeatherData(etCityName.getText().toString(), OPEN_WEATHER_APP_ID, MainActivity.this)

任何人都可以帮助并解释这个警告。

1 个答案:

答案 0 :(得分:8)

您似乎也需要声明T类型,在您的情况下,它必须是response.body()个实例的类。

尝试替换

public static void getOpenWeatherData(String city, String appId, IWeatherCallbackListener listener)

public static void getOpenWeatherData(String city, String appId, IWeatherCallbackListener<ResponseBody> listener)

就是这样,因为当你声明你的界面时

IWeatherCallbackListener<T>

您使用T及其原始类型。创建实例时,您必须显示您将使用的完全类型或您希望作为参数接收的确切类型。

例如,如果手动创建必须看起来像这个

的侦听器
IWeatherCallbackListener<ResponseBody> listener = new IWeatherCallbackListener<ResponseBody>() {
    //implementation of methods
}

参数相同,你必须展示你可以收到的T