尝试扩展HttpURLConnection类时出错

时间:2013-02-13 13:44:27

标签: java android 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 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

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

url.openConnection()不返回MyHUC类型的对象,因此您无法安全地将其强制转换为该类。请阅读上面的文章,了解继承的工作原理。