расширение суперкласса и ClassCastException - PullRequest
4 голосов
/ 24 ноября 2010

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

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.

Ответы [ 4 ]

16 голосов
/ 24 ноября 2010

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

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 .

0 голосов
/ 24 ноября 2010

похоже, что проблема решена.Я попытался

object = new MyCustomClass(blahblah);

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

0 голосов
/ 24 ноября 2010

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

0 голосов
/ 24 ноября 2010

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

...