Por que não Java autoboxing estender-se a chamadas de método de métodos dos tipos autoboxed?

votos
48

Eu quero converter um primitivo para uma cadeia, e eu tentei:

myInt.toString();

Esta falha com o erro:

int cannot be dereferenced

Agora, eu entendo primitivos não são tipos de referência (ou seja, não um objeto) e por isso não pode ter métodos. No entanto, Java 5 introduziu autoboxing e unboxing (a la C # ... que eu nunca gostei em C #, mas isso não vem ao caso). Assim, com autoboxing, eu esperaria que o anterior para converter myInt para um inteiro e, em seguida, chamar toString () sobre isso.

Além disso, acredito C # permite tal chamada, a menos que eu lembre-se de forma incorreta. Isto é apenas uma desvantagem infeliz de autoboxing / especificação unboxing do Java, ou há uma boa razão para isso?

Publicado 07/08/2008 em 02:05
fonte usuário
Em outras línguas...                            


8 respostas

votos
45

Java autoboxing / unboxing não ir ao ponto de permitir que você dereference um primitivo, para que o seu compilador impede. Seu compilador ainda sabe myIntcomo um primitivo. Há um artigo sobre esta questão na jcp.org .

Autoboxing é útil principalmente durante a atribuição ou a passagem de parâmetro - o que lhe permite passar um primitivo como um objeto (ou vice-versa), ou atribuir um primitivo de um objeto (ou vice-versa).

Então, infelizmente, você teria que fazê-lo como este: (elogios Patrick, eu mudei para o seu caminho)

Integer.toString(myInt);
Respondeu 07/08/2008 em 02:09
fonte usuário

votos
27

Ditto sobre o que Justin disse, mas você deve fazer isso em vez disso:

Integer.toString(myInt);

Ele salva uma atribuição ou dois e é mais legível.

Respondeu 07/08/2008 em 02:16
fonte usuário

votos
15

Uma outra maneira de fazer isso é usar:

String.valueOf(myInt);

Este método é sobrecarregado para cada tipo primitivo e Object. Desta forma, você não tem sequer a pensar sobre o tipo que você está usando. Implementações do método irá chamar o método apropriado do tipo dado para você, por exemplo Integer.toString(myInt).

Veja http://java.sun.com/javase/6/docs/api/java/lang/String.html .

Respondeu 10/08/2008 em 08:32
fonte usuário

votos
9

parece ser uma lacuna da especificação para mim

Há mais deficiências e este é um tema sutil. Verifique este para fora:

public class methodOverloading{
   public static void hello(Integer x){
      System.out.println("Integer");
   }

   public static void hello(long x){
      System.out.println("long");
   }

   public static void main(String[] args){
      int i = 5;
      hello(i);
   }
}

Aqui "longo" seria impresso (não verifiquei por mim mesmo), porque o compilador choses alargando ao longo autoboxing. Tenha cuidado ao usar autoboxing ou não usá-lo em tudo!

Respondeu 07/08/2008 em 05:16
fonte usuário

votos
5

A sintaxe válido mais próximo ao seu exemplo é

((Integer) myInt).toString();

Quando o compilador termina, isso é equivalente a

Integer.valueOf(myInt).toString();

No entanto, isso não funcionar tão bem como o uso convencional, String.valueOf(myInt)porque, exceto em casos especiais, ele cria uma nova instância Integer, logo em seguida joga fora, resultando em lixo mais desnecessário. (Um pequeno intervalo de números inteiros são armazenados em cache, e acesso por um acesso de matriz). Talvez projetistas da linguagem queria desencorajar este uso por razões de desempenho.

Edit: eu apreciaria se o downvoter (s) iria comentar sobre por que isso não é útil.

Respondeu 24/09/2008 em 17:18
fonte usuário

votos
1

Seria útil se o Java definidos certos métodos estáticos para operar em tipos primitivos e construído no compilador pouco de açúcar sintático para que

5.asInteger

seria equivalente a

some.magic.stuff.Integer.asInteger(5);

Eu não acho que esse recurso poderia causar incompatibilidade com qualquer código que compila sob as regras atuais, e que iria ajudar a reduzir a desordem sintática em muitos casos. Se Java eram primitivas Autobox que foram dereferenced, as pessoas podem assumir que ele foi mapear a sintaxe dereferencing para chamadas de método estático (que é efetivamente o que acontece em .NET), e assim que as operações escritos nessa forma não eram mais caro do que seria os equivalentes chamadas de método estático. Adicionando um novo recurso de linguagem que incentive as pessoas a escrever código ruim (primitivos dereferenced por exemplo, auto-boxing) não parece ser uma boa idéia, embora permitindo que os métodos de estilo dereferencing poderia ser.

Respondeu 31/01/2014 em 00:26
fonte usuário

votos
1

Como todos apontou, autoboxing permite simplificar algum código, mas você não pode fingir que os primitivos são tipos complexos.

Também interessante: "autoboxing é um hack de nível compilador" em Java. Autoboxing é basicamente um truque estranho adicionado em Java. Confira este post para mais detalhes sobre como é estranho.

Respondeu 23/01/2010 em 15:16
fonte usuário

votos
1

Em C #, números inteiros são nem tipos de referência nem têm de ser encaixotado, a fim de ToString () ser chamado. Eles são considerados objetos no quadro (como um ValueType, então eles têm semântica de valor), no entanto. No CLR, métodos em primitivos são chamados por "indiretamente" carregá-los para a pilha (ldind).

Respondeu 10/09/2008 em 22:20
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more