Пример экземпляра - PullRequest
       5

Пример экземпляра

19 голосов
/ 07 февраля 2012
public class TableModel2 extends TableModel1 { ... }

TableModel2 tableModel = new TableModel2();

boolean t1 = tableModel instanceof TableModel1;
boolean t2 = tableModel instanceof TableModel2;

В приведенном выше примере t1 и t2 равны true. Итак, как я могу различить TableModel1 и TableModel2, используя instanceof?

Ответы [ 7 ]

20 голосов
/ 07 февраля 2012

Вы не можете сделать это с instanceof, но вы можете сделать это с getClass:

boolean t1 = tableModel.getClass().equals(TableModel1.class);
boolean t2 = tableModel.getClass().equals(TableModel2.class);

Оператор instanceof предназначен для полной проверки иерархии классов вплоть до java.lang.Object, включая проверки для всех интерфейсов. Он позволяет узнать, можно ли привести экземпляр объекта, который у вас есть, к указанному вами типу, не вызывая исключение приведения класса.

getClass, с другой стороны, возвращает определенный класс данного объекта.

17 голосов
/ 07 февраля 2012
boolean t2 = tableModel.getClass().equals(TableModel1.class); //False
boolean t2 = tableModel.getClass().equals(TableModel2.class); //True
7 голосов
/ 07 февраля 2012

Итак, как я могу различить TableModel1 и TableModel2, используя instanceof?

Технически, вы можете проверить, что tableModel является экземпляром TableModel1, а not и экземпляр TableModel2:

(tableModel instanceof TableModel1) && !(tableModel instanceof TableModel2)

Однако я хотел бы призвать вас самым решительным образом избегать любого кода, который разветвляется на основе результата instanceof или getClass().Такой код очень хрупок перед лицом будущих изменений.Если вы обнаружите, что делаете что-то в этом направлении, это убедительный признак того, что сейчас самое время вернуться к вашему дизайну.

5 голосов
/ 07 февраля 2012

экземпляр означает " - это ".

TableModel2 IS A TableModel1.
But TableModel1 IS NOT A TableModel2.
so

package main;

public class TempClass {
    public static void main(String[] args) {
        TableModel1 tableModel1 = new TableModel1();
        TableModel1 tableModel2 = new TableModel2();

        System.out.println(tableModel1 instanceof TableModel1);
        System.out.println(tableModel1 instanceof TableModel2);

        System.out.println(tableModel2 instanceof TableModel1);
        System.out.println(tableModel2 instanceof TableModel2);
    }

    public static class TableModel1 {
    }

    public static class TableModel2 extends TableModel1 {
    }
}

true
false

true
true
4 голосов
/ 07 февраля 2012

Вы не можете. Если вам действительно нужно отличить одно от другого, используйте вместо него tableModel.getClass(), например:

boolean t1 = tableModel.getClass() == TableModel1.class;
boolean t2 = tableModel.getClass() == TableModel2.class;

Обратите внимание, что вы сознательно пытаетесь нарушить один из основополагающих принципов ООП, поэтому убедитесь, что вы не можете избежать этого трюка, прежде чем использовать его в реальном коде.

1 голос
/ 07 февраля 2012

Легко, используйте имена классов:

public class Test
{
    public class TableModel1
    {
    };

    public class TableModel2 extends TableModel1
    {
    };

    public TableModel2 tableModel = new TableModel2();

    public static void main(String[] args)
    {
        Test t = new Test();
        System.out.println("t1=" + t.tableModel.getClass().equals(TableModel1.class));
        System.out.println("t2=" + t.tableModel.getClass().equals(TableModel2.class));
    }
}
1 голос
/ 07 февраля 2012

Ну, я не верю, что ты можешь. С точки зрения наследования tableModel является абсолютно допустимой ссылкой для обоих типов, поэтому instanceof вернет true в обоих случаях.

...