我正在阅读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程序员如何知道何时进行此类转换,何时不知道?
答案 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
中未定义的任何方法。
通常,您使用为您提供所需操作的类 - 如果您知道您获得的结果可以转换为该类。