Por que não autoboxing do Java estender para o método de invocações de métodos de autoboxed tipos?

StackOverflow https://stackoverflow.com/questions/4242

  •  08-06-2019
  •  | 
  •  

Pergunta

Eu quero converter uma primitiva para uma seqüência de caracteres, 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, portanto, não pode ter métodos.No entanto, o Java 5 introduzido autoboxing e unboxing (a la C#...que eu nunca gostei em C#, mas que é ao lado do ponto).Assim, com o autoboxing, eu esperaria que o acima para converter myInt para um número Inteiro e, em seguida, chamar toString() em que.

Além disso, eu acredito C# permite a uma chamada, a menos que eu lembre incorretamente.Isso é apenas uma lamentável lacuna de autoboxing do Java/unboxing especificação, ou há uma boa razão para isso?

Foi útil?

Solução

Java autoboxing/unboxing não ir para a extensão para permitir que você para anular a referência de uma primitiva, então o compilador evita-lo.O compilador sabe ainda myInt como um primitivo.Há um artigo sobre esse problema em jcp.org.

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

Então, infelizmente, você teria que fazer como esta:(parabéns Patrick, eu mudei para o seu caminho)

Integer.toString(myInt);

Outras dicas

Idem no que o Justin disse, mas você deve fazer isso:

Integer.toString(myInt);

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

Uma outra maneira de fazer isso é usar:

String.valueOf(myInt);

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

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

parece uma lacuna da especificação para mim

Há mais de deficiências e esta é uma sutil tópico.Seleção este out:

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 "tempo" seria impresso (não verificado mim), porque o compilador escolhe de ampliação de mais de autoboxing.Tenha cuidado ao usar o autoboxing ou não usá-lo em tudo!

A sintaxe válida mais próximo do seu exemplo é

((Integer) myInt).toString();

Quando o compilador termina, que é equivalente a

Integer.valueOf(myInt).toString();

No entanto, isso não executar, bem como o uso comum, String.valueOf(myInt), porque, exceto em casos especiais, ele cria um novo número Inteiro instância, logo em seguida lança-o de ti, resultando em mais de lixo desnecessários.(Um pequeno intervalo de números inteiros são armazenados em cache e acesso por uma matriz de acesso.) Talvez os designers de linguagens queria desencorajar o seu uso por razões de desempenho.

Editar:Eu gostaria que se o downvoter(s) gostaria de comentar sobre o porquê de isto não é útil.

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

Como todo mundo tem apontado, autoboxing permite simplificar o código, mas você não pode fingir que primitivos são tipos complexos.

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

Seria útil se o Java definido determinados métodos estáticos para operar em tipos primitivos e construído para o compilador alguns açúcar sintático para que

5.asInteger

seria equivalente a

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

Eu não penso que tal recurso deverá causar incompatibilidade com qualquer código que compila sob as regras atuais, e ele iria ajudar a reduzir sintática desordem em muitos casos.Se o Java fosse autobox primitivos que foram diferenciado, as pessoas podem assumir que ele foi o mapeamento de referência sintaxe de chamadas de método estático (que é efetivamente o que acontece .NET), e, portanto, que as operações de escrita em que o formulário não eram mais dispendiosas do que seria o equivalente estático invocações de método.Adicionar um novo recurso de linguagem que seria incentivar as pessoas a escrever código ruim (e.g.auto-boxing cancelou a referência primitivos) não parece ser uma boa idéia, embora permitindo referência de estilo métodos pode ser.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top