2013-02-13 103 views
2

我試圖創建HttpURLConnection類的自定義版本。嘗試擴展HttpURLConnection類時出錯

類現在看起來是這樣的:

package com.removed; 

import java.net.HttpURLConnection; 
import java.net.URL; 

public abstract class MyHUC extends HttpURLConnection { 

    public MyHUC(URL url) { 
     super(url); 
     // TODO Auto-generated constructor stub 
    } 

} 

但是,當我打電話:

MyHUC connection = (MyHUC) url.openConnection(); 

我收到以下錯誤:

02-13 14:42:23.639: E/AndroidRuntime(4735): FATAL EXCEPTION: Thread-760 
02-13 14:42:23.639: E/AndroidRuntime(4735): java.lang.ClassCastException: libcore.net.http.HttpURLConnectionImpl cannot be cast to com.removed.MyHUC 
02-13 14:42:23.639: E/AndroidRuntime(4735):  at com.removed.TVSlideActivity.DownloadFile(TVSlideActivity.java:603) 
02-13 14:42:23.639: E/AndroidRuntime(4735):  at com.removed.TVSlideActivity.access$9(TVSlideActivity.java:588) 
02-13 14:42:23.639: E/AndroidRuntime(4735):  at com.removed.TVSlideActivity$5.run(TVSlideActivity.java:337) 
02-13 14:42:23.639: E/AndroidRuntime(4735):  at java.lang.Thread.run(Thread.java:856) 

這是推動我瘋了,我一直在網上尋找一個解決方案几個小時,現在任何專家都可以啓發我嗎?

謝謝!

回答

2

在您當前的設置中,URL類對您的自定義URL連接類一無所知。您撥打的電話將返回URLConnection類型(恰好是HttpURLConnection,但這是一個實現細節)。您不能將生成的連接投射到MyHUC類型,因爲它的不是一個。重要的是要記住未來。

因爲它恰巧有到指定URL類的自定義URL連接類的方法。您必須利用其他構造函數來創建URL,並提供URLStreamHandler。示例代碼如下所示:

public class MyURLConnection extends HttpURLConnection { 

    public MyURLConnection(URL arg0) { 
     super(arg0); 
    } 

    @Override 
    public void disconnect() { 
    } 

    @Override 
    public boolean usingProxy() { 
     return false; 
    } 

    @Override 
    public void connect() throws IOException { 
    } 
} 

public class MyURLStreamHandler extends URLStreamHandler { 

    public MyURLStreamHandler() { 
     super(); 
    } 

    @Override 
    protected URLConnection openConnection(URL arg0) throws IOException { 
     return new MyURLConnection(arg0); 
    } 
} 

而且使用這樣的:

final URL url = new URL("http", "www.google.com", -1, "", 
     new MyURLStreamHandler()); 
final MyURLConnection conn = (MyURLConnection) url.openConnection(); 
+0

非常感謝,這會好得多! 我現在唯一的問題是調用默認的「連接」和「斷開」的方法......他們是抽象的方法... 我實際上喜歡HttpURLConnection默認情況下,然後只替換幾個方法。 – Wildcopper 2013-02-13 14:50:12

+0

@Wildcopper你以某種方式解決它? – serj 2016-11-30 14:35:57

0

http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

url.openConnection()沒有返回MyHUC類型的對象,所以你不能安全地將它轉換爲該類。請閱讀上面的文章以掌握繼承是如何工作的。

+0

我明白了,即使這聽起來怪我,因爲它是提示HttpURLConnection的...感謝的孩子! – Wildcopper 2013-02-13 14:52:29

+0

如果有疑問,請使用instanceof操作符,看看是否可以將一個對象轉換爲另一個對象 – 2013-02-13 14:56:13