2013-02-13 69 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