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

时间:2015-04-05 18:55:54

标签: java httpurlconnection

我正在阅读Java Programming Interviews Exposed这本书。他们提供了这个代码示例,我不明白:

@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程序员如何知道何时进行此类转换,何时不知道?

2 个答案:

答案 0 :(得分:1)

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

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

请参阅下一行,正在设置请求方法:connection.setRequestMethod("GET");这是特定于http请求

您无需转换responseInputStream,因为IOUtils能够使用InputStream抽象类的实例。

答案 1 :(得分:0)

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

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

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

通常,您使用为您提供所需操作的类 - 如果您知道您获得的结果可以转换为该类。