为什么我需要在这个 Java 示例中强制转换 HttpURLConnection?

Why do I need to cast HttpURLConnection in this Java example?

我正在阅读 Java 编程面试公开这本书。他们提供了这个代码示例,我不明白:

@Test
public void makeBareHttpRequest() throws IOException {

  final URL url = new URL("http", "en.wikipedia.org", "/");

  final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

  connection.setRequestMethod("GET");

  final InputStream responseInputStream = connection.getInputStream();

  final int responseCode = connection.getResponseCode(); 

  final String response = IOUtils.toString(responseInputStream); 

  responseInputStream.close(); 

  assertEquals(200, responseCode); 

  System.out.printf("Response received: [%s]%n", response); 

}

是否有关于何时需要转换变量的一般规则(在右侧)?为什么 HttpURLConnection 在这里被强制转换为右侧:

  final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

但是responseInputStream这里不需要在右边强制转换:

  final InputStream responseInputStream = connection.getInputStream();

Java 程序员如何知道何时进行这种转换,何时不进行?

A URL 可以是任何类型的方案,例如ftp、http、https、文件等

因此,如果您打算执行 HTTP 操作,则必须将其转换为 HttpURLConnection

看下一行,正在设置请求方法:connection.setRequestMethod("GET");这是http请求特有的

您不需要强制转换 responseInputStream 因为 IOUtils 可以使用 InputStream 抽象的实例 class.

在此程序中,您转换为 HttpURLConnection,因为您需要使用在 HttpURLConnection 中可用的方法,而在其父 classes 中不可用,方法 setRequestMethod().

可以 这样做是因为你知道你的 URL 是一个 HTTP URL,因此 URLConnection 对象将是从它返回的将是 HttpURLConnection.

您不需要转换 connection.getInputStream() 的结果,因为它 returns InputStream 并且您不需要 InputStream 中未定义的任何方法。

通常,您使用 class 来提供您需要的操作 - 如果您知道您得到的结果可以转换为 class。