De erro "tipo genérico ilegal para instanceof" ao usar classes locais

Lukas Eder:

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 Zherda 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 Znã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?

Rafael Winterhalter:

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 instanceofexpressã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 instanceofguloseimas operador Zcomo 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.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=37600&siteId=1
Recomendado
Clasificación