Java 为什么HttpURLConnection的getInputStream()方法返回RealBufferedSource类型的对象?

Java 为什么HttpURLConnection的getInputStream()方法返回RealBufferedSource类型的对象?,java,android,android-asynctask,inputstream,httpurlconnection,Java,Android,Android Asynctask,Inputstream,Httpurlconnection,我正在尝试使用下面的代码从Android Studio中的AsyncTask发送HTTP请求 protected Long doInBackground(URL... urls) { try { HttpURLConnection connection = (HttpURLConnection) urls[0].openConnection(); connection.setRequestMethod("POST"); connection

我正在尝试使用下面的代码从Android Studio中的
AsyncTask
发送HTTP请求

protected Long doInBackground(URL... urls) {
    try {
        HttpURLConnection connection = (HttpURLConnection) urls[0].openConnection();
        connection.setRequestMethod("POST");
        connection.connect();

        byte[] loginRequestBytes = new Gson().toJson(loginRequest, LoginRequest.class).getBytes();
        connection.getOutputStream().write(loginRequestBytes);

        if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
            ResponseBody responseBody = (ResponseBody) connection.getInputStream(); // ResponseBody extends InputStream
            loginResponse = new Gson().fromJson(responseBody.toString(), LoginResponse.class);
        }
    } catch (IOException e) {
        Log.e("HttpClient", e.getMessage(), e);
    }

    return null;
}
我的
ResponseBody
类扩展了
InputStream
,因此我认为

ResponseBody responseBody = (ResponseBody) connection.getInputStream();
这会起作用,但问题是:

我的代码中有一个
ClassCastException
,因为
connection.getInputStream()
返回类型为
com.android.okhttp.okio.realburedSource$1的对象。为什么
getInputStream
没有按照返回
InputStream
?这是安卓特有的问题吗

编辑:我自己定义了ResponseBy类(如下所示)。它是而不是
okhttp
中的,据我所知,它确实扩展了
InputStream

public class ResponseBody extends InputStream {

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        String line;

        try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(this, "UTF-8"))) {
            while ((line = bufferedReader.readLine()) != null) {
                stringBuilder.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return stringBuilder.toString();
    }

    @Override
    public int read() throws IOException {
        return 0;
    }
}
getInputStream()
方法确实返回一个
InputStream
。但您正试图将结果强制转换为
响应库
。除非结果对象是
ResponseBody
的子类型的实例,否则这将不起作用。。。但事实并非如此

现在,不清楚您试图在这里使用哪个
ResponseBody
类,但是如果它是
okhttp3.ResponseBody
(),那么您无法通过强制转换
输入流来获得它


实际上,我自己定义了
ResponseBody
类。它是
InputStream
的一个简单扩展(请参见编辑),因此我认为向下转换应该可以工作

啊。我明白了

不,那不行。不能将对象强制转换为它不是的类型。这不是类型转换所做的。。。对于引用类型

您有一个匿名内部类的实例

  com.android.okhttp.okio.RealBufferedSource$1
它是
InputStream
的子类型。您正试图将其强制转换为
响应库
,该响应库也是
输入流
的子类型。但是
ResponseBody
不是匿名类的超类或接口,因此类型转换无法成功

我建议您将
ResponseBody
重写为
InputStream
的包装类和/或使用此处列出的解决方案之一,将
InputStream
的内容提取为
字符串


这可能有助于您了解
HttpURLConnection.getInputStream()
返回一个
InputStream
“我的ResponseBy类扩展了InputStream,所以我想使用。”->您指的是哪个响应体?这个-。这不会根据文档扩展InputStream。你想看看这个页面吗:@RakeshRoy我实际上自己定义了ResponseBody类。这是InputStream的一个简单扩展(请参见编辑),感谢您的回答!实际上,我自己定义了ResponseBody类。它是InputStream的一个简单扩展(请参见编辑),因此我认为向下转换应该可以工作