Eu tenho o seguinte código Java que usa uma classe local .
import java.util.Arrays;
public class X<T> {
void m() {
class Z {}
for (Object o : Arrays.asList(1, 2, 3))
if (o instanceof Z) {}
}
}
Ele não compilar com a seguinte mensagem de erro:
X.java:8: error: illegal generic type for instanceof
if (o instanceof Z) {}
^
1 error
Eu entendo que a classe local Z
herda a assinatura de tipo genérico de X<T>
, sendo uma classe interna. O mesmo tipo de erro de compilação aparece neste exemplo, onde Z
não é local, mas ainda interna:
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
}
}
Ele pode ser trabalhado em torno quer fazendo Z
/ static não-interno:
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
}
}
Ou por qualificaçãoX.Z
:
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
}
}
}
Mas como posso qualificar uma classe local, ou contornar esta limitação, sem alterar a classe local em si?
Para mim, isso parece ser um descuido ou limitação na linguagem Java e eu não acho que isso é possível.
O tipo referenciado numa instanceof
expressão deve ser reifiable acordo com JLS 4,7 , o que significa que deve ser expresso como um tipo reifiable pelo seu nome completo. Ao mesmo tempo, JLS 6.7 estados que as classes locais não têm um nome totalmente qualificado, eles podem, portanto, ser expressa como reifiable.
Se você declarar Z como genérico, as instanceof
guloseimas operador Z
como um tipo de matéria, onde todas as propriedades genéricas para ele - neste caso a classe delimitador - são considerados matéria também. (Semelhante a um métodos genéricos de um tipo de matéria que está sendo considerado como matéria despeito de qualquer assinatura genérica. Esta é uma medida para reter trás compatibilidade de tipo generification.) Uma vez que qualquer tipo de matéria é reifiable, declarando Z ser genérico irá compilar.