Подтвердить что ты не робот

Пример "предпосылки"

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?

4b9b3361

Ответ 1

boolean t2 = tableModel.getClass().equals(TableModel1.class); //False
boolean t2 = tableModel.getClass().equals(TableModel2.class); //True

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

Просто используйте имена классов:

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));
    }
}