DEV Community

FUNDAMENTOS JAVA
FUNDAMENTOS JAVA

Posted on

Tipos brutos e código legado

Os tipos brutos foram introduzidos para permitir a compatibilidade entre códigos legados (pré-genéricos) e os genéricos introduzidos no JDK 5. Eles possibilitam a transição gradual, mas comprometem a segurança de tipos.

Definições e Características
Tipo bruto:

  • Usar uma classe genérica sem especificar argumentos de tipo. Exemplo:
Gen raw = new Gen(new Double(98.6)); // Tipo bruto criado

Enter fullscreen mode Exit fullscreen mode

Compatibilidade:

Variáveis de tipo bruto podem receber qualquer objeto genérico e vice-versa.
Não há verificação de tipos em tempo de compilação, resultando em possíveis erros em tempo de execução.

Exemplo de Código

// Classe Gen com suporte a genéricos
class Gen<T> {
    T ob; // Declara um objeto do tipo T

    Gen(T o) { // Construtor
        ob = o;
    }

    T getob() { // Retorna o objeto ob
        return ob;
    }
}

// Demonstração de tipos brutos
class RawDemo {
    public static void main(String[] args) {
        // Usando genéricos corretamente
        Gen<Integer> iOb = new Gen<>(88);
        Gen<String> strOb = new Gen<>("Generics Test");

        // Criando um tipo bruto
        Gen raw = new Gen(new Double(98.6));
        double d = (Double) raw.getob(); // Funciona, mas perde segurança de tipos
        System.out.println("value: " + d);

        // Erros de tempo de execução com tipos brutos
        // int i = (Integer) raw.getob(); // Erro de tempo de execução!

        // Atribuição de tipo bruto para genérico
        strOb = raw; // Correto, mas perigoso
        // String str = strOb.getob(); // Erro de tempo de execução!

        // Atribuição de genérico para tipo bruto
        raw = iOb; // Correto, mas perigoso
        // d = (Double) raw.getob(); // Erro de tempo de execução!
    }
}

Enter fullscreen mode Exit fullscreen mode

Riscos do Uso de Tipos Brutos
Falta de Segurança de Tipos:

  • Atribuir tipos brutos a genéricos ou vice-versa pode causar erros em tempo de execução.

Exemplos:

strOb = raw; // Perigoso: raw contém Double, mas strOb espera String
raw = iOb; // Perigoso: raw agora contém Integer, mas coerção pode falhar

Enter fullscreen mode Exit fullscreen mode

Exceções em Tempo de Execução:

Não há como detectar inconsistências em tempo de compilação.
Exemplo:

int i = (Integer) raw.getob(); // Erro porque raw contém Double

Enter fullscreen mode Exit fullscreen mode

Avisos de Não Verificação:

  • O compilador javac gera avisos quando detecta tipos brutos usados de forma insegura.

Exemplos que geram avisos

Gen raw = new Gen(new Double(98.6)); // Tipo bruto
strOb = raw; // Atribuição insegura

Enter fullscreen mode Exit fullscreen mode

Recomendações
Evitar o uso de tipos brutos:

  • Sempre use argumentos de tipo para aproveitar a segurança oferecida pelos genéricos.

Exemplo:

Gen<Integer> iOb = new Gen<>(88); // Correto e seguro

Enter fullscreen mode Exit fullscreen mode

Tratar código legado com cuidado:

  • Adicione verificações e testes rigorosos ao integrar código pré-genéricos com genéricos.

Image of Datadog

The Essential Toolkit for Front-end Developers

Take a user-centric approach to front-end monitoring that evolves alongside increasingly complex frameworks and single-page applications.

Get The Kit

Top comments (0)

Heroku

This site is powered by Heroku

Heroku was created by developers, for developers. Get started today and find out why Heroku has been the platform of choice for brands like DEV for over a decade.

Sign Up