Использование instanceof для тестирования интерфейсов

У меня были небольшие проблемы с этой проблемой. Вопрос:

Напишите полную программу на Java, которая делает следующее:

  • объявляет интерфейсы I1 и I2, оба с пустыми телами
  • объявить интерфейс I3 с пустым телом, который расширяет оба вышеупомянутых интерфейса
  • объявить интерфейс I4 с пустым телом
  • класс X реализует I3 с пустым телом
  • класс W с пустым телом реализует I4 и расширяет X
  • create a class InstanceofTest that does the following in the main():
    • Create an object w of class W.
    • Используйте оператор instanceof, чтобы проверить, реализует ли объект w каждый из интерфейсов и имеет ли он тип X, и отобразите соответствующее сообщение.

Итак, вот что я придумал до сих пор:


public interface I1
{

}

public interface I2
{

}

public interface I3 extends I1, I2
{

}

public interface I4
{

}

public class W extends X implements I4
{

}

У меня небольшая путаница с методом InstanceofTest. Я знаю, что оператор instanceof сообщит вам, является ли определенный объект экземпляром определенного типа, например, когда вы делаете это следующим образом:


public class InstanceofTest
{

    public static void main(String[] args)
    {
        W w = new W();
        if (w instanceof X)
        {
            System.out.println("w is an instance of X.");
        }
    }
}

Проблема, с которой я сталкиваюсь, заключается в использовании instanceof, чтобы увидеть, реализует ли w каждый из интерфейсов. Я понятия не имею, как я буду это делать. Любая помощь будет принята с благодарностью!


Редактировать: Итак, я должен сделать это так?


public class InstanceofTest
{
    public static void main(String[] args)
    {
        W w = new W();
        if (w instanceof X)
        {
            System.out.println("w is an instance of X.");
        }

        if (w instanceof I1)
        {
            System.out.println("w implements I1.");
        }

        if (w instanceof I2)
        {
            System.out.println("w implements I2.");
        }

        if (w instanceof I3)
        {
            System.out.println("w implements I3.");
        }

        if (w instanceof I4)
        {
            System.out.println("w implements I4.");
        }
    }
}


person zaynv    schedule 24.03.2014    source источник
comment
Да, ваши попытки мне кажутся правильными, у вас что-то не так с вашим кодом?   -  person nachokk    schedule 25.03.2014
comment
О нет, я не говорю, что у меня проблемы с моим следующим кодом. У меня просто проблемы с одним из пунктов, которые я должен сделать: используйте оператор instanceof, чтобы проверить, реализует ли объект w каждый из интерфейсов и имеет ли он тип X, и отобразите соответствующее сообщение. Я не уверен, что делать для этого.   -  person zaynv    schedule 25.03.2014
comment
instanceof можно использовать с типом интерфейса так же, как и для X.   -  person ajb    schedule 25.03.2014
comment
Скопируйте и вставьте свой тест instanceof и замените X на каждый interface. В чем проблема?   -  person Boris the Spider    schedule 25.03.2014
comment
О, я понятия не имел, что вы можете использовать instanceof для проверки типов экземпляров. Большое спасибо!   -  person zaynv    schedule 25.03.2014
comment
вы можете получить массив реализованных интерфейсов, используя myObject,getClass().getInterfaces(), а затем вы можете проверить, какой элемент этого массива является вашим желаемым интерфейсом   -  person G3ntle_Man    schedule 21.09.2018


Ответы (2)


Ну, вот полное решение для вас:

public interface I1 {}

public interface I2 {}

public interface I3 extends I1, I2 {}

public interface I4 {}

public class X implements I3 {}

public class W extends X implements I4 {}

public class InstanceofTest {
  public static void main(String[] args){
      W w = new W();

      if (w instanceof I1)
        System.out.println("W implements I1");

      if (w instanceof I2)
        System.out.println("W implements I2");

      if (w instanceof I3)
        System.out.println("W implements I3");

      if (w instanceof I4)
        System.out.println("W implements I4");

      if (w instanceof X)
        System.out.println("W extends X");
    }
}

И в результате W реализует каждый интерфейс и расширяет X.

person vikingmaster    schedule 24.03.2014
comment
Большое спасибо, я только что понял это из другого комментария! Спасибо, что нашли время! - person zaynv; 25.03.2014
comment
К вашему сведению, публикация полного кода ответов на домашние вопросы не одобряется. Единственная причина, по которой я не голосую против, заключается в том, что ОП говорит, что ответ уже был очевиден до того, как вы опубликовали. - person Boris the Spider; 25.03.2014
comment
@BoristheSpider публикация такого ответа не такая уж большая проблема, это никому не повредит, и я мог бы получить небольшой рейтинг. Кроме того, тщательное изучение - это личное дело ОП. В этом вопросе я вижу некоторые утверждения, но никаких реальных проблем или объяснений проблем, поэтому я просто опубликовал все решение. Для меня ответ даже на относительно небольшой / простой вопрос является проблемой, поскольку я учусь сам, ища информацию и тестируя свой собственный код. - person vikingmaster; 25.03.2014

Сохраните эти интерфейсы в Collection, например Set<Class> classes, затем переберите их и сравните с вашим объектом.

person Mati    schedule 24.03.2014
comment
instanceof нужно имя типа, а не объект. Вы не можете перебирать имена типов. - person ajb; 25.03.2014
comment
Я не хотел использовать instanceof для сравнения, я должен был указать это в своем ответе. Вы можете использовать interface1.isInstance(w) (интерфейс - это объект класса из набора). - person Mati; 25.03.2014
comment
В задании ОП говорилось, что он должен использовать instanceof. - person ajb; 25.03.2014