为什么我会收到“不兼容的类型:无法将Object转换为String”的错误信息?

5

我正在尝试使用最简单的代码来从Android应用程序调用Web API REST方法,而我找到的代码在这里看起来非常有前途:

public String callWebService(String requestUrl)
{
    String deviceId = "Android Device";

    HttpClient httpclient = new DefaultHttpClient();
    HttpGet request = new HttpGet(requestUrl);
    request.addHeader("deviceId", deviceId);

    ResponseHandler handler    = new BasicResponseHandler();
    String result = "";

    try
    {
        result = httpclient.execute(request, handler); // <= a line too far
    }
    catch (ClientProtocolException e)
    {
        e.printStackTrace();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }

    httpclient.getConnectionManager().shutdown();

    return result;
}

然而,它无法编译,告诉我:“不兼容的类型:无法将Object转换为String”,出现在这一行:
result = httpclient.execute(request, handler);

它提供了一些选项来尝试规避僵局: enter image description here ......但我不知道这些选项中的任何一个是否是解决这个困境的首选方式。有没有一种方法是“正确”的?
更新:
正如我所说,这段代码看起来很有前途,但我认为它基本上无法使用,因为它会给我带来可怕的“NetworkOnMainThreadException”异常。从日志中可以看到:
04-01 13:18:41.861    1267-1267/hhs.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
. . .
    java.lang.IllegalStateException: Could not execute method of the activity
. . .
     Caused by: java.lang.reflect.InvocationTargetException
. . .
     Caused by: android.os.NetworkOnMainThreadException
2个回答

6

因为您在使用一个原始类型

ResponseHandler handler = ...

使用原始类型时,方法声明中的类型变量将被擦除。因此,所有内容都显示为Object(或者是类型参数左侧绑定的任何内容)。

相反,请使用参数化类型。

ResponseHandler<String> handler = ...

这也成立的原因是因为 BasicResponseHandler 扩展了 ResponseHandler<String>

现在

httpclient.execute(request, handler);

当声明handler时,将与类型参数关联的返回类型,其为String,因此结果可以分配给String变量(或任何需要String的地方)。


1

试试这个:

result = httpclient.execute(request, handler).toString();

如果我没错的话,你应该能够使用 "toString" 方法将 execute 方法的返回值转换为字符串类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接