2012-06-26 2 views
1

У меня есть следующий абстрактный класс:Класса литье неясность

public abstract class AbstractGroup { 

private String name; 
. 
. 
. 
} 

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

public class GroupA extends AbstractGroup { 
} 

public class GroupB extends AbstractGroup { 
} 

Есть ли способ бросить следующий без получения ClassCastException : (group имеет тип GroupA)

group = (GroupB)group; 

Мне нужен экземпляр этого объекта, чтобы он стал GroupB.

ответ

11

Невозможно. Вы не можете классифицировать классы горизонтально, но только вертикально. GroupA не является подтипом GroupB, поэтому исключение всегда будет поднято.

1

Нет, вы не можете. Вы можете перевернуть вверх или вниз по иерархии наследования.

+0

На самом деле вы ошибаетесь. Вы можете использовать только иерархию. Попробуйте это (отбрасывание), посмотрите, что произойдет: http://pastebin.com/iPrCZWGd. –

+2

отбрасывание возможно, если у вас есть объект подкласса и ссылка суперкласса. – Ahmad

+0

SomeMethod (SuperClass OBJ) { \t \t, если (OBJ InstanceOf SubClass) { \t \t \t \t SubClass subref = (Подкласс) OBJ; \t} } ...... Разве это неправда? ?? – Ahmad

0

Нет, это невозможно. Но то, что вам может понравиться, - это добавить в группы некоторые конструкторы, позволяющие строить из другой реализации.

public class GroupA extends AbstractGroup { 
    public GroupA(AbstractGroup otherGroup) { 
     this.name = otherGroup.name; 
    } 
} 

Однако, если вам нужно сделать это, возможно, ваш дизайн может быть неправильным.

1

Нет, вы не можете, поскольку GroupA не является экземпляром GroupB. Как насчет:

public abstract class AbstractGroup { 

    public Enum Group { GroupA, GroupB; } 

    private String name; 
    private Group membership; 
. 
. 
. 
} 

И потом:

group.setMembership(GroupB); 
1

Что вы просите не называется литья, но преобразование. Оба термина охватываются зонтичным термином принуждение. Java не будет автоматически конвертировать объект для вас, и он даже не мог бы попытаться, так как это, как правило, нечеткая проблема. Вы должны написать свой собственный код, который будет выполнять преобразование - либо в форме конструктора преобразования, либо какой-либо статический метод преобразования, либо, может быть, метод экземпляра в исходном объекте, который возвращает преобразованный объект.

-1

Возможно, если вы делаете что-то вроде:

GroupA groupAobj = new GroupA(); 
    AbstractGroup abstractObj = (AbstractGroup) groupAobj; 
    GroupB groupBobj = (GroupB) abstractObj; 

код компилируется и работает.

+0

компилирует, запускает и бросает ClassCastException: 'GroupA нельзя отбрасывать в GroupB' - вопрос в том, как этого избежать! –

+0

это исключение. Почему бы вам просто не поймать исключение и не сработать соответствующим образом. – vedant1811

+0

Исключение означает, что он не работает. Почему я этого не понимаю? потому что: 1-й - это не моя проблема, на самом деле я не понимаю, почему это необходимо; Второй - вопрос (мое понимание) заключается в том, как получить экземпляр GroupB из экземпляра GroupA БЕЗ получения исключения! –

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