2010-11-23 4 views
3

У меня есть суперкласс, который два метода я хочу переопределить. Вот мой код:расширение суперкласса и ClassCastException

public class MyCustomClass extends SomeSuperClass { 

protected MyCustomClass(params) { 
    super(params); 
} 
@Override 
public void method1() { 
    super.method1(); 
    /* here goes my code */ 
} 
@Override 
public void method2() { 
    super.method2(); 
    /* here goes my another code */ 
} 

У меня есть конструктор, который передает объект SomeSuperClass в качестве параметра, и то, что я делать дальше:

MyCustomClass object; 
/* now i have object of type SomeSuperClass, 
but with my own method1() and method2() */ 
object = (MyCustomClass) MyCustomClass.item(blahblah); 
/* eclipse suggests casting, because MyCustomClass.item() 
constructor still returns SomeSuperClass object */ 
otherobject = OtherConstructor.object(object); 
//OtherConstructor passes SomeSuperClass object 

Это кажется правильным, но я получаю Java. lang.ClassCastException в SomeSuperClass при выполнении.

Если я создаю SomeSuperClassObject, я потеряю свои методы переопределения.

С отливкой, даже если в затмении нет ошибок, сбой приложений. Другими словами, как я могу переопределить SomeSuperClass своими собственными методами и все еще получить объект SomeSuperClass для использования с OtherConstructor? Если это важно, этот код предназначен для приложения для Android.

+3

Что такое код для MyCustomClass.item? – Powerlord 2010-11-23 21:04:53

+0

это не чрезмерно, так что это (и это действительно так, по словам помощника по eclipse code) просто используйте метод суперкласса – artemy 2010-11-23 21:15:56

+0

, чтобы быть педантичным, `MyCustomClass.item()` не является «конструктором» и не является «OtherConstructor.object»() ` – 2010-11-23 21:19:03

ответ

0

Если метод item() указан в SomeSuperClass, я сомневаюсь, что он возвращает экземпляр MyCustomClass. Таким образом, ваш листинг (MyCustomClass) MyCustomClass.item(blahblah) будет недействительным.

+0

почему бы и нет? если у него есть оба класса бота в момент компиляции, статический метод item() в родительском может вернуть конкретный экземпляр подкласса (например, какой-то простой заводский метод) ... – malejpavouk 2010-11-23 21:36:38

15

Как правило, вы можете привести экземпляр подкласса родительского класса:

MyCustomClass object = new MyCustomClass(params); 
SomeSuperClass superClass = (SomeSuperClass) object; 

Однако, вы не можете привести экземпляр суперкласса к подклассу:

SomeSuperClass object = new SomeSuperClass(params); 
MyCustomClass customClass = (MyCustomClass) object; // throws ClassCastException 

Это связано с тем, что объект MyCustomClass также является объектом SomeSuperClass, но не все объекты SomeSuperClass являются объектами MyCustomClass.

Возможно, вам удастся обойти это с помощью определенных шаблонов проектирования. Сама Java имеет тенденцию использовать Decorator pattern.

0

Из того, что я вижу, кажется, что вызов MyCustomClass.item (blahblah) возвращает что-то другое (возможно, родительское), чем MyCustomClass. Его единственная часть в тексте кода, где вы являетесь объектом литья ...

0

выглядит как проблема решена. Я пробовал

object = new MyCustomClass(blahblah); 

И он работал. Кстати, может кто-нибудь объяснить это?

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