É um erro de tempo de compilação passar argumentos de tipo para uma classe membro não estática ou interface de um tipo bruto que não é herdado de suas superclasses ou superinterfaces.
Não consigo pensar em quando essa frase deve ser usada. Eu mesmo concebi um pedaço de código:
class OuterGenericClass<T> {
class InnerGenericClass<U> {}
}
public class Main {
public static void main(String[] args)
OuterGenericClass outer = new OuterGenericClass(); //The raw type OuterGenericClass is used
OuterGenericClass<String>.InnerGenericClass<Integer> inner = outer.new InnerGenericClass<Integer>(); //error
}
}
Não acho que passei um argumento de tipo para a classe interna. Só adicionei um argumento de tipo ao seu construtor. Então, mais tarde, pensei que meu exemplo não deveria ser explicado por esta frase.
Então, que situação essa frase ilustra? Você poderia me dar um exemplo? Obrigado pela leitura.
Esta regra proíbe “tipos semi-parametrizados” enquanto ainda permite tipos brutos. Tipos brutos são tipos genéricos sem parâmetros de tipo fornecidos. Eles são fornecidos como um recurso legado e não devem ser usados em código novo. (Observe que, devido à eliminação de tipo, o código que usa tipos brutos normalmente compila para o mesmo que o código que usa tipos parametrizados).
As seguintes declarações do JLS 4.8 são apropriadas:
e
Um exemplo da situação descrita em sua citação é dado na caixa alguns parágrafos acima. Dada a seguinte declaração de classe:
A seguinte declaração é ilegal de acordo com a regra que você citou:
Aqui, Outer é usado como um tipo bruto, pois não recebe nenhum parâmetro de tipo. Portanto, Outer.Inner é uma “classe membro não estática de um tipo bruto que não é herdada de sua superclasse”. Portanto, passar argumentos de tipo para ela é ilegal.
Os seguintes formulários são legais:
O formato a seguir também é ilegal, pois mistura tipos brutos e parametrizados de maneira diferente, e é proibido pelo parágrafo após o que você citou ("É um erro de tempo de compilação tentar usar uma classe membro ou interface de um tipo parametrizado como um tipo bruto."):
Experimente o código online .