我正在處理一些從 Java 8 移過來的 Java 11 測驗代碼。代碼如下所示:
HttpsURLConnection urlc = setupURLConnection(url);
boolean eqs = urlc.equals(urlc);
assertFalse("Unexpected equals returned", eqs);
查看 Java 11 檔案,它提到當對自身呼叫 equals 時,任何非空參考物件都應回傳 true。但是,在 Java 8 中,上述測驗通過了測驗,即上述測驗確定 urlc 在 Java 8 中不等于自身,而在 Java 11 中,測驗確定 urlc 等于自身。我還可以確認 equals 方法沒有被任何東西覆寫,它只是標準的 Object.equals 方法。
哪個版本的測驗正確,哪個不正確?是否有可能測驗代碼實際上是正確的,并且 Java 11 代碼存在一些導致測驗失敗的問題?謝謝你的幫助!
uj5u.com熱心網友回復:
已知錯誤
Java 8 版本已損壞,因為它違反了equals().
創建 HttpsURLConnection 時您實際得到的是一個sun.net.www.protocol.https.HttpsURLConnectionImpl實際上有一個equals()方法的:
public boolean equals(Object obj) {
return delegate.equals(obj);
}
委托(通常是 a sun.net.www.protocol.https.DelegateHttpsURLConnection)反過來正確實作equals()并因此回傳 false,因為委托本身不是 的實體HttpsURLConnectionImpl。
如果您的測驗依賴于這種損壞的行為,那么您的測驗也應該被視為損壞的。
請參見問題 # JDK-8055299,HttpsURLConnection.equals() 損壞。在 Java 7 和 Java 8 中存在錯誤,在 Java 9 和更高版本中修復。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358585.html
