Проблема с "instanceof" с общим внешним классом - PullRequest
2 голосов
/ 27 июля 2011

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

class OuterClass<T> {

    class BaseClass { }

    class SubClass extends BaseClass { }

    public void test(BaseClass myObject) {
        boolean b = (myObject instanceof SubClass);
    }
}

Сообщение об ошибке метода test(): " Невозможно выполнить проверку экземпляра для параметризованного типа MyOuterClass.MySubClass. Вместо этого используйте форму MySubClass, так какдальнейшая информация общего типа будет удалена во время выполнения"

Так как же определить, имеет ли переменная тип BaseClass?Я перепробовал все следующее, и они не работают:

boolean b1 = (myObject instanceof SubClass);
boolean b2 = (myObject instanceof SubClass<T>);
boolean b3 = (myObject instanceof SubClass<?>);
boolean b4 = (myObject instanceof OuterClass.SubClass);
boolean b5 = (myObject instanceof OuterClass<T>.SubClass);
boolean b6 = (myObject instanceof OuterClass<?>.SubClass);
boolean b7 = (myObject instanceof OuterClass.SubClass<T>);
boolean b8 = (myObject instanceof OuterClass.SubClass<?>);

Я думаю, что эта проблема не зависит от версии JVM, но на всякий случай я использую версию Sun 1.6.0_22-b04.

Ответы [ 4 ]

2 голосов
/ 27 июля 2011

Это только частичный ответ, но если мы изменим пример следующим образом, он скомпилируется:

class OuterClass<T> {

    class InnerClass { }

    public void test(Object myObject) {
        boolean b1 = (myObject instanceof OuterClass.InnerClass);     // Works
        boolean b2 = (myObject instanceof OuterClass<?>.InnerClass);  // Also works
    }
}
1 голос
/ 28 июля 2011

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

class OuterClass<T> {

    static class BaseClass { }

    static class SubClass extends BaseClass { }

    public void test(BaseClass myObject) {
        boolean b = (myObject instanceof SubClass);
    }
}

... и вуаля! ошибки компилятора ушли с ветром

1 голос
/ 27 июля 2011

Ваш код для b4 правильный.По крайней мере для 1.6.0_23.

class OuterClass<T> {

    class BaseClass { }

    class SubClass extends BaseClass { }

    public void test(BaseClass myObject) {
        boolean b = (myObject instanceof OuterClass.SubClass);
        System.out.println(b);
    }

    public static void main(String[] args) {
        OuterClass<Integer> outerClass = new OuterClass<Integer>();
        OuterClass<Integer>.BaseClass b = outerClass.new BaseClass();
        OuterClass<Integer>.SubClass s = outerClass.new SubClass();
        outerClass.test(b);
        outerClass.test(s);
    }
}

Вывод:

false
true

Версия Java:

java version "1.6.0_23"
Java(TM) SE Runtime Environment (build 1.6.0_23-b05)
Java HotSpot(TM) 64-Bit Server VM (build 19.0-b09, mixed mode)
0 голосов
/ 28 июля 2011

Спасибо высококалицинированному и Nulldevice за указание, что b4 и b6 правильные.

Я обнаружил, что это ошибка в версии Eclipse, которую я использовал. (Я использовал Ganymede, и это было исправлено, когда я обновился до Helios.)

Просто для записи, я подал его как Eclipse bug 353354 .

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