Ответ 1
boolean t2 = tableModel.getClass().equals(TableModel1.class); //False
boolean t2 = tableModel.getClass().equals(TableModel2.class); //True
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
?
boolean t2 = tableModel.getClass().equals(TableModel1.class); //False
boolean t2 = tableModel.getClass().equals(TableModel2.class); //True
Вы не можете сделать это с помощью instanceof
, но вы можете сделать это с помощью getClass
:
boolean t1 = tableModel.getClass().equals(TableModel1.class);
boolean t2 = tableModel.getClass().equals(TableModel2.class);
Оператор instanceof
предназначен для проверки иерархии классов вплоть до java.lang.Object
, включая проверки всех интерфейсов. Он позволяет узнать, может ли экземпляр объекта, который у вас есть, указать тип, указанный вами, без запуска исключения класса.
getClass
, с другой стороны, возвращает конкретный класс данного объекта.
Итак, как я мог различать TableModel1 и TableModel2 с помощью instanceof?
Технически вы можете проверить, что tableModel
- это экземпляр TableModel1
и не и экземпляр TableModel2
:
(tableModel instanceof TableModel1) && !(tableModel instanceof TableModel2)
Тем не менее, я хотел бы настоятельно рекомендовать вам в максимально возможной степени избегать любого кода, который ведется на основе результата instanceof
или getClass()
. Такой код очень хрупок перед лицом будущих изменений. Если вы обнаружите, что делаете что-либо в этом направлении, это говорит о том, что, возможно, самое подходящее время для пересмотра вашего дизайна.
экземпляр означает, что -.
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
Вы не можете. Если вам действительно нужно сказать одно от другого, используйте tableModel.getClass()
вместо этого, как в:
boolean t1 = tableModel.getClass() == TableModel1.class;
boolean t2 = tableModel.getClass() == TableModel2.class;
Обратите внимание, что вы намеренно пытаетесь нарушить один из основополагающих принципов ООП, поэтому убедитесь, что вы не можете избежать этого трюка, прежде чем использовать его в реальном коде.
Хорошо, я не думаю, что ты можешь. С точки зрения наследования tableModel
является абсолютно достоверной ссылкой для обоих типов, поэтому instanceof
вернет true в обоих случаях.
Просто используйте имена классов:
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));
}
}