У меня есть следующий код Java, который использует локальный класс.
import java.util.Arrays;
public class X<T> {
void m() {
class Z {}
for (Object o : Arrays.asList(1, 2, 3))
if (o instanceof Z) {}
}
}
Он не компилируется со следующим сообщением об ошибке:
X.java:8: error: illegal generic type for instanceof
if (o instanceof Z) {}
^
1 error
Я понимаю, что локальный класс Z
наследует сигнатуру универсального типа X<T>
, являющуюся внутренним классом. Такая же ошибка компиляции появляется в этом примере, где Z
не локально, а по-прежнему внутренне:
import java.util.Arrays;
public class X<T> {
class Z {}
void m() {
for (Object o : Arrays.asList(1, 2, 3))
if (o instanceof Z) {} // Compilation error
}
}
Это можно обойти, либо сделав Z
не внутренним/статическим:
import java.util.Arrays;
public class X<T> {
static class Z {}
void m() {
for (Object o : Arrays.asList(1, 2, 3))
if (o instanceof Z) {} // Compiles now
}
}
Или с помощью квалификации XZ
:
import java.util.Arrays;
public class X<T> {
class Z {}
void m() {
for (Object o : Arrays.asList(1, 2, 3)) {
if (o instanceof X.Z) {} // Compiles now
if (o instanceof X<?>.Z) {} // Also
}
}
}
Но как я могу квалифицировать локальный класс или обойти это ограничение, не меняя сам локальный класс?