Oii José, tudo bem?
A principal razão para essa diferença tá relacionada ao recurso de inferência de tipo do Java, introduzido no Java 7 com o operador diamante (<>
). Quando você usa new Caixa<>()
, o compilador Java infere automaticamente o tipo de parâmetro genérico com base no tipo declarado na variável. Por exemplo:
Caixa<Double> caixaDeValor = new Caixa<>();
Aqui, o compilador infere que o tipo de Caixa
é Double
baseado no lado esquerdo da atribuição.
Mas, quando você usa new Caixa()
, você não tá especificando explicitamente o tipo genérico. Isso pode levar a uma situação chamada "raw type" (tipo bruto), onde o tipo genérico não é especificado. Usar tipos brutos é desencorajado porque você perde todos os benefícios de segurança e clareza de tipos que os genéricos oferecem.
No entanto, em contextos onde o tipo genérico pode ser claramente inferido, como na inicialização direta de uma variável, o Java permite usar o operador diamante para simplificar o código. Aqui está um exemplo prático para ilustrar isso:
public class TestaCaixa {
public static void main(String[] args) {
Caixa<Integer> caixaDeIdade = new Caixa(); // Raw type, desencorajado
caixaDeIdade.setConteudo(30); // Funciona, mas não é a prática ideal
Caixa<Integer> caixaDeNumero = new Caixa<>(); // Uso do operador diamante, tipo inferido e seguro
caixaDeNumero.setConteudo(45); // Seguro e claro
}
}
Recomenda-se sempre especificar o tipo genérico usando o operador diamante para evitar o uso de tipos brutos e manter a segurança e clareza do tipo no seu código.
Um abraço e bons estudos.