Compiladores se comportam de maneira diferente com um parâmetro nulo de um método genérico
O código a seguir compila perfeitamente com o Eclipse, mas falha ao compilar com o javac:
public class HowBizarre {
public static <P extends Number, T extends P> void doIt(P value) {
}
public static void main(String[] args) {
doIt(null);
}
}
Eu simplifiquei o código, para que T não seja usado agora. Ainda assim, não vejo uma razão para o erro. Por alguma razão, javac decide que T significa Object e depois reclama que Object não está de acordo com os limites de T (o que é verdadeiro):
HowBizarre.java:6: tipos incompatíveis; argumentos do tipo inferido java.lang.Number, java.lang.Object não estão em conformidade com os limites das variáveis do tipo P, T
encontrado :<P,T>
vazio
necessário: nulo
doIt(null);
^
Observe que, se eu substituir o parâmetro nulo por um valor não nulo, ele será compilado.
Qual dos compiladores se comporta corretamente e por quê? Isso é um bug de um deles?