Возвращает ли instanceof значение true, если экземпляр родительского элемента? - PullRequest
44 голосов
/ 10 июня 2011

У меня есть класс Child, который расширяет Parent.

Parent child = new Child();

if (child instanceof Parent){
    // Do something
}

Возвращает ли это значение true или false, и почему?

Ответы [ 4 ]

54 голосов
/ 10 июня 2011

Да , было бы. А почему бы и нет?

Потому что child на самом деле является экземпляром Parent. Если вы хотите выполнить операцию только для ребенка, отметьте

if (child instanceof Child){
}

Однако вы должны помнить следующее высказывание Скотта Мейерса из Effective C ++:

"Каждый раз, когда вы пишете код формы "если объект имеет введите T1, затем сделайте что-нибудь, но если это типа T2, тогда сделай что-нибудь иначе "пощечина.

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

ПРИМЕЧАНИЕ: Я не скомпилировал его.

class Parent {
    public void doSomething() {
        System.out.println("I am the Parent, and I do as I like");
    }
}

class ChildA extends Parent {
    public void doSomething() {
        System.out.println("I am a child named A, but I have my own ways, different from Parent");
    }
}

class ChildB extends Parent {
    public void doSomething() {
        System.out.println("I am a child named B, but I have my own ways, different from my Parent and my siblings");
    }
}

public class Polymorphism101 {

    public static void main(String[] args) {

        Parent p = new Parent();
        p.doSomething();

        p = new ChildA();
        p.doSomething();

        p = new ChildB();
        p.doSomething();

    }

}

РЕДАКТИРОВАТЬ: лучший пример

Возможно, вы разрабатываете приложение для рисования . Приложение, которое рисует фигуры любого вида. В этом случае у вас должен быть abstract type Shape.

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

Интерфейс Shape / абстрактный класс / виртуальный класс должен иметь abstract / pure virtual функцию Draw(). Итак, в вашем DrawToDeviceLoop вы просто вызываете Draw() для каждой фигуры, вам никогда не нужно проверять, какая она фигура.

Интерфейс Shape может иметь абстрактную реализацию AbstractShape, которая может иметь имя или идентификатор фигуры в качестве членов данных и GetName, Cleanup и другие функции с функциями, общими для всех фигур.

Помните, что абстрактный тип не может быть создан , поэтому сам Shape не может быть создан, так как он также не может быть нарисован.

5 голосов
/ 10 июня 2011

instanceof вернет true, если это подкласс ...

экземпляр документации

0 голосов
/ 09 августа 2017

Да .Значение instanceof будет истинным, когда ссылка (левая сторона выражения instanceof) может быть приведена к ReferenceType (тип справа от выражения instanceof).Это будет верно для подклассов по отношению к их родителям:

Child child = new Child();
Parent parent = (Parent) child; //works!
assert child instanceof Parent; //true

С Спецификация языка Java, издание Java SE 9 :

15,20.Реляционные операторы
...
RelationalExpression instanceof ReferenceType

15.20.2.Оператор сравнения типов instanceof
...
Во время выполнения оператор instanceof получает true, если значение RelationalExpression не равно null, и ссылка может быть приведена к ReferenceType без повышения ClassCastException.В противном случае результат false.

0 голосов
/ 10 июня 2011

Конечно, он возвращает истину, потому что child является экземпляром родителя

...