关于 Java 中向上投射的困惑



>我正在用java编写网络代码,它看起来像下面:

//Declaring the reference variable
HttpsURLConnection httpsURLConnection = null;
AuthHttpURLConnection authHttpURLConnection = null;
httpsURLConnection = (HttpsURLConnection) ProxyUrlConnection.openConnection(url);
httpsURLConnection.setSSLSocketFactory(getSocketFactory());
authHttpURLConnection = new AuthHttpURLConnection(httpsURLConnection);

我不是ProxyUrlConnection和AuthHttpURLConnection的作者,但这里有一个描述:

ProxyURLConnection

public class ProxyURLConnection{
public static synchronized URLConnection openConnection(URL url) throws IOException {
URLConnection urlConnection = null;
urlConnection = url.openConnection();
return urlConnection;
}
... more stuff
}

AuthHttpURLConnection

public class AuthHttpUrlConnection() extends HttpURLConnection{
public AuthHttpURLConnection(HttpURLConnection connection) {
super(connection.getURL());
// sets up the auth headers
}
}

最后是 HttpURLConnection和 HttpsURLConnection

我的具体问题:

  1. 我如何能够进行此转换? openConnection 返回一个 URLConnection 的对象,我怎样才能进行这种向下转换而不会收到任何运行时错误?

    (HttpsURLConnection) ProxyUrlConnection.openConnection(url);
    
  2. 以下隐式向上转换是如何工作的?

    AuthHttpURLConnection(httpsURLConnection);
    

    我知道向上转换总是合法的,但是如果我这样做,那么该实例是否成为httpURLConnection的对象而不是httpsURLConnection,一旦发生这种情况,我如何能够在httpURLConnection的对象上调用方法setSSLSocketFactory,因为此方法仅存在于httpsURLConnection中?

一般来说,以下代码有几个可能的运行时流:


httpsURLConnection = (HttpsURLConnection) ProxyUrlConnection.openConnection(url);
httpsURLConnection.setSSLSocketFactory(getSocketFactory());
  1. 如果传递的url参数具有"https://"方案,那么它应该可以正常工作。
  2. 如果传递的url以任何其他方案开头(例如。'http://', 'ftp://')然后ProxyUrlConnection.openConnection(url);可能会返回URLConnection的不同实现(例如HttpURLConnectionJarURLConnection),那么你的代码仍将编译,但是,在应用程序运行时,你会得到一个ClassCastException,这将阻止流的进一步执行(因此来了你的问题:setSSLSocketFactory永远不会被实际调用用于URLConnection的其他实现)

只要在此处理流之前对https://方案进行显式验证,就可以使用该代码段,否则您必须显式处理返回不同URLConnection实现以防止ClassCastException的情况。

长话短说:

我如何能够进行此转换? openConnection 返回一个 URLConnection 的对象,我怎样才能进行这种向下转换而不会收到任何运行时错误?

只要你有显式强制转换,那么这段代码就会编译。但是,如果返回除HttpsURLConnection之外的任何其他URLConnection实现,它将在应用程序运行时失败,ClassCastException

我如何在httpURLConnection的对象上调用方法setSSLSocketFactory,因为此方法仅存在于httpsURLConnection中?

如果提供了非"https"URI,则应用程序执行流将在到达setSSLSocketFactory方法调用之前ClassCastException失败(请参阅上一点)

以下隐式向上转换是如何工作的?

AuthHttpURLConnection(httpsURLConnection);只要应用程序流达到这一点,这个隐式强制转换将始终有效,这将确保connectionHttpURLConnection的任何子类的实例,否则ClassCastException会在该点之前被抛出(请参阅前面的 2 点)

希望这有帮助。

相关内容

  • 没有找到相关文章

最新更新