Java 在同一个变量中同时支持HttpURLConnection和HttpsURLConnection?

Java 在同一个变量中同时支持HttpURLConnection和HttpsURLConnection?,java,http,Java,Http,我正在创建一个处理HTTP连接的类,我想同时处理HTTP和HTTPS,但使用相同的变量(因此我可以使用相同的代码发送数据等)。目前,我的代码如下所示: if (ssl) { conn = (HttpsURLConnection) new URL(...).openConnection(); conn.setHostnameVerifier(...); } else { conn = (HttpURLConnection) new URL(...).openConnecti

我正在创建一个处理HTTP连接的类,我想同时处理HTTP和HTTPS,但使用相同的变量(因此我可以使用相同的代码发送数据等)。目前,我的代码如下所示:

if (ssl)
{
    conn = (HttpsURLConnection) new URL(...).openConnection();
    conn.setHostnameVerifier(...);
}
else
{
    conn = (HttpURLConnection) new URL(...).openConnection();
}
当“conn”的类型为HttpsURLConnection时,HttpURLConnection强制转换失败。当“conn”的类型为HttpURLConnection或URLConnection时,“setHostnameVerifier”和其他与HTTPS相关的方法是不可访问的


鉴于HttpsURLConnection是HttpURLConnection类的一个子类,我本以为强制转换它会起作用,但我显然错了。是否有任何方法可以使此代码正常工作,以便我可以在需要时访问HTTPS方法?

只需保留
conn
一个
URLConnection
,并在
if
块中创建一个更具体的本地引用

URLConnection conn;

// ...

conn = new URL(...).openConnection();

// ...

if (conn instanceof HttpsURLConnection) {
    HttpsURLConnection httpsConn = (HttpsURLConnection) conn;
    httpsConn.setHostnameVerifier(...);
}

// ...
或者只是

// ...

if (conn instanceof HttpsURLConnection) {
    ((HttpsURLConnection) conn).setHostnameVerifier(...);
}

// ...
请记住,在Java中,您处理的是引用,而不是值。因此,此处不创建副本。

请尝试以下操作:

((HttpsURLConnection) new URL(...).openConnection()).setHostnameVerifier(...);

在大多数情况下,您应该保留默认的主机名验证程序。谢谢。我尝试了你给出的第二个例子,但很明显,我一定是把括号放错地方了。