我正在尝试创建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)
这让我发疯了,我一直在网上寻找一个解决方案好几个小时,这里的任何专家都可以启发我吗?
谢谢!
答案 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
类型的对象,因此您无法安全地将其强制转换为该类。请阅读上面的文章,了解继承的工作原理。