Somente no caso de tipos primitivos, o casting faz algum tipo de conversão. Entre objetos, o casting não é conversão.
Ele apenas indica que um objeto que está sendo tratado como alguém da classe pai, pode ser tratado como alguém da classe filha. Entretanto, o objeto mesmo não sofre qualquer tipo de transformação.
O que acontece é que o autoboxing só funciona se o Java estiver entendendo o objeto em questão como um dos tipos wrappers: Double, Float, Long, Integer, Short, Byte ou Boolean. Se esse tipo estiver numa referência do tipo Object, o java não tem como garantir que a conversão pode ser feita para um tipo primitivo.
Rocomentando o seu código, portanto, fica assim.
[code]package pacoteTeste;
public class TesteWrapper {
static long numero = 10L; // variavel static (numero) do tipo primitivo long
public static void main(String[] args) {
// O método go exige um Object, mas numero é um tipo primitivo. Existe então autoboxing.
// O primitivo long é convertido para um objeto da classe Long, que é filho de Object.
new TesteWrapper().go(numero);
}
//Aqui recebemos nosso Long numa variável do tipo Object.
public void go(Object numero){
// Informamos ao java que sabemos que o Object recebido se trata de um Long.
//Como se trata mesmo, não temos um ClassCastException
//O wrapper Long só pode ser convertido para o tipo primitivo long, e a conversão ocorre nessa linha.
//Entretanto, até informarmos ao java que o Object se trata de um Long, o auto-unboxing não ocorrerá,
//por isso o cast.
long teste1 = ((Long)numero);
//Informamos ao java que o Object se refere a um Long, para poder haver unboxing.
//Então, ocorre auto-unboxing desse Long para long. O tipo primitivo long já pode ser convertido para double.
//Não há conversão de tipos direta entre wrappers (Long para Double).
double teste = (double)((Long) numero);
System.out.println(teste1);
System.out.println(teste);
}
}
[/code]