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

Спасибо большое, это намного лучше! Моя единственная проблема теперь в том, чтобы вызвать методы «connect» и «disconnect» по умолчанию ... и они являются абстрактными методами ... Мне действительно понравилась копия HttpURLConnection, которая по умолчанию работает так же, как оригинал, а затем заменить только несколько методов. – Wildcopper

+0

@Wildcopper вы решили это как-то? – serj

0

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

url.openConnection() не возвращает MyHUC тип объекта, так что вы не можете спокойно бросить его к этому классу. Пожалуйста, прочитайте выше статью, чтобы понять, как работает наследование.

+0

Я понимаю, даже если это звучит странно для меня, так как это дитя HttpURLConnection ... спасибо за подсказку! – Wildcopper

+0

если у вас есть сомнения, используйте экземпляр оператора, чтобы посмотреть, можете ли вы сделать один объект в другом –

Смежные вопросы