2015-07-22 2 views
1

Для кода ниже,компиляции проверка времени с использованием InstanceOf

package java_instanceof; 

     /* 
     *     
     *      Object     I0 
     * I1 I2  ^  \    .^
     *  . .   |   \   . | 
     *  . .  |   \ ______ .  | 
     *   . .  C1   |__B___|  I3 
     *   . . /     .   
     *    .. /     .    
     *    C2     .    
     *    ^    .          
     *    |   .     
     *    |  .      
     *    | . 
     *    C3 
     *           
     */ 

interface I0{}; interface I1{}; interface I2 {}; 
interface I3 extends I0{}; 

class C1{}; class B implements I0{}; 
class C2 extends C1 implements I1, I2 {} 
class C3 extends C2 implements I3 {} 

public class Example { 

    public static void main(String[] args) { 


     Object o; Object[] oa; 
     I0 i0; I0[]  i0a; 
     I1 i1; I1[]  i1a; 
     I2 i2; I2[]  i2a; 
     I3 i3; I3[]  i3a; 
     C1 c1; C1[]  c1a; 
     C2 c2; C2[]  c2a; 
     C3 c3; C3[]  c3a; 
     B  b; B[]  ba; 

     //Compile time check 
     boolean value1 = c3 instanceof B; //compile time check error 
     boolean value2 = b instanceof C3; // compile time check error 


    } 

} 

Как новичок, я хотел бы знать, как это javac в состоянии поднять компиляции ошибки времени Incompatible conditional operand type? Является ли полная иерархия классов известной во время компиляции?

+0

«Является ли иерархия классов известной во время компиляции?» - Ну, да, что вы ожидали? – Smutje

+0

Вы можете прочитать [исключения времени компиляции в JLS] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-11.html#jls-11.2) –

ответ

1

Да и нет. Конечно, иерархия классов всех классов и интерфейсов в скомпилированном файле и импортированных им файлах известна во время компиляции. Однако во время выполнения могут быть дополнительные классы и интерфейсы.

В вашем случае, однако, как C3 и B классы, а затем на основе имеющейся информации достаточно, чтобы определить, что c3 никогда не может ссылаться на экземпляр B и b никогда не может ссылаться на экземпляр C3. Это происходит потому, что классы наследуются от одного (или, в случае Object, нет) суперкласса.

С интерфейсами ситуация другая. Следующий фрагмент не приведет к компиляции ошибки времени:

I1 i1 = ... ; 
boolean v = i1 instanceof B; 

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

+0

Добавление другого 'класса D' выше, 'класс D расширяет B реализует I1 {}; B b = новый D(); value = b instanceof I2;' это должно давать 'false' во время выполнения. но почему компилятор не может найти ошибку 'несовместимого операнда 'во время компиляции? – overexchange

+0

Чтобы решить, должна ли отображаться ошибка компилятора, компилятор только смотрит на типы оператора 'instanceof'. Кто-то может определить подкласс 'D', который также реализует' I2', и поэтому 'b instanceof I2' не приводит к ошибке компилятора. – Hoopje

+0

Итак, базовая точка - это множественный подкласс, который может реализовать интерфейс, поэтому компилятор сохраняет тишину, когда вы указываете тип интерфейса как правый операнд, правильно? – overexchange

0

Да! Конечно, иерархия, возможно, она «реализует» или «расширяет» и т. д. известна во время компиляции.

Без этих проверок вы не можете использовать OOPS даже во время программирования в древо отношений, которые вы пытаетесь закодировать.

Рассмотрим пример объекта самого класса, если объект не был предком всех классов, вы не могли бы в состоянии замещать ToString(), хэш-код(), клон() методы, которые в основном приходят из класса объектов. Таким образом, вы получаете эти методы в intellisence любой IDE, поэтому они уже предварительно скомпилированы до даже исполнения.

0

Да, компилятор сначала ищет лексическую иерархию метода, затем в иерархии классов и, наконец, в глобальной области. для получения дополнительной информации о том, как работает компилятор, вы можете ссылаться на книгу «Инженерное программирование» по методу Keith Cooper- Method и class Invocation.

для вашего первого вопроса вы можете найти это http://codereply.com/answer/42s61x/instanceof-incompatible-conditional-operand-types.html полезно.

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