2011-12-27 4 views
1

Есть ли у кого-нибудь работоспособная стратегия решения вопросов кастинга/повышения? Я понимаю, что, когда восходящее и понижающее действие разрешено, но когда вопросы, как правило, связаны с несколькими объектами, я очень быстро запутался. Например, что это лучший подход к поиску ответа на вопрос, как это:Устранение проблем с повышением/понижением

Вопрос: Что бы результат компиляции следующей программы:

interface Inter{} 
class Base implements Inter{} 
class Derived extends Base{} 

class ZiggyTest2{ 

    public static void main(String[] args){ 

     Base b = new Base(); 
     Derived d = new Derived(); 
     Inter i = (Base)b; 
     i = (Base)d; 
     Derived bd = (Derived)b; 
     b = (Base)i;   
    } 
} 

Я не очень заинтересованный в ответе, но больше подход к решению вопроса. Есть ли какой-либо подход/стратегия, которую я могу использовать для решения вопроса о повышении/понижении, например выше? Например, можно ли рисовать ссылки/объекты на бумаге, чтобы я мог получить визуальное представление и может ли это помочь?

Благодаря

ответ

1

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

E.g.:

class Animal { } 
class Dog extends Animal { } 
class Bulldog extends Dog { } 

Если вы пишете:

Animal animal = new Animal(); 
Dog d = (Dog) animal; 

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

Animal animal = new Animal(); 
Dog d = (Dog) animal; 
String s = (String) animal; 

Это, безусловно, не удастся, поскольку компилятор знает, что String and Dog не находятся в одной иерархии.

Те же правила применяются и к интерфейсам.

Надеюсь, это поможет.

2

Есть несколько простых правил,

  • Вы можете бросить в класс predescessor (все пути к объекту) (никогда не Fais)
  • Вы можете бросить к подклассу - это может потерпеть неудачу в runtime
  • Вы можете преобразовать в интерфейс из класса, который его реализует (никогда не сработает)
  • Вы можете преобразовать из interafce в класс imemneting - это может завершиться неудачно во время выполнения

В первых двух правилах применяются также ti intefaces.

Вы можете нарисовать UML class diagram, чтобы визуализировать его (только с инструментами = реализует, расширяет реалии), перемещение по графику будет безопасным в направлении стрелок. Навигация по другому пути будет временем использования. И плавание без расширения/реализации отношений было бы невозможно.

+0

Хорошо описан ответ. –

3

Вот great article о повышении и понижении.

Цитата из статьи -

Во-первых, вы должны понимать, что литьем вы на самом деле не меняется сам объект, вы просто помечая ее по-разному.

Задайте себе вопрос: «Каков тип объекта?» и затем помните, что законно передавать его любому классу предшественника в иерархии класса (включая интерфейсы).

В вашем случае вы создаете 2 объекта, Base и Derived. Base может быть помечен как Inter или Base, а Derived может быть помечен как Inter, Base или Derived. Таким образом, ваш код будет компилироваться просто отлично. Но во время выполнения, когда вы пытаетесь применить Base b к Derived bd, вы получите исключение ClassCastException.

1

Для меня я хотел бы сначала нарисовать иерархию этих типов. Для вашего вопроса, то "уровни" типов являются:


Inter (выше)

Base (выше)

Derived


" уровень "объекта определяется при его создании, и объект может только« идти »вверх не вниз в зависимости от его уровня создания. Например, объект b создается как объект Base, поэтому он находится на уровне Base. Вы можете легко узнать, что b может повышать до Inter, но не утаивать до Derived, независимо от того, какой тип используется для описания b. Если для описания b используется Inter, так как его уровень создания Base, вы можете понизить его до Base.

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