Почему экземпляр не работает с JPanel и JComponent? - PullRequest
2 голосов
/ 06 мая 2011

Мне кажется, что я упускаю что-то ослепительно очевидное, так что низко висящий фрукт для гуру Java:

У меня есть код, который выглядит так:

private static void myFunc(JComponent c) {
        if (c instanceof JPanel) {
            //stuff
        }
        else if (c instanceof JMenu) {
            // other stuff
        }
}

Несмотря на то, что JPanel и JMenu являются подклассами JComponent, первый instanceof выдает ошибку:

Incompatible conditional operand types JComponent and JPanel

Хотя второй работает нормально. Почему он думает, что мой JComponent никогда не может быть JPanel?

Ответы [ 4 ]

6 голосов
/ 06 мая 2011

Я подозреваю, что вы импортируете другую JPanel откуда-то. На минуту попробуйте использовать полностью квалифицированные типы:

private static void myFunc(javax.swing.JComponent c) {
    if (c instanceof javax.swing.JPanel) {
        //stuff
    }
}

Кроме того, я не могу придумать ни одной причины, по которой он не будет компилироваться ... если вы можете придумать короткую, но полную программу, которая демонстрирует проблему, это поможет. Это прекрасно компилируется:

import javax.swing.JComponent;
import javax.swing.JPanel;

public class Test {

    public static void myFunc(JComponent c) {
        if (c instanceof JPanel) {
            System.out.println("yes");
        }
    }
}
1 голос
/ 06 мая 2011

Следующий код прекрасно компилируется:

import javax.swing.*;

class Panel
{
  private static void myFunc(JComponent c) {
    if (c instanceof JPanel) {
      //stuff
    } else if (c instanceof JMenu) {
      // other stuff
    }
  }
}
1 голос
/ 06 мая 2011

Используйте это:

if(javax.swing.JPanel.isInstance(c)){

1 голос
/ 06 мая 2011

Я бы дважды проверил импорт.

Вы уверены, что импортировали тот самый JPanel и тот самый JComponent класс, который вы хотели? Они следующие?

 import javax.swing.JPanel;
 import javax.swing.JComponent;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...