Почему не Java Autoboxing распространяется на вызовы методов методов autoboxed типов?

голоса
48

Я хочу, чтобы преобразовать примитивно в строку, и я попробовал:

myInt.toString();

Это терпит неудачу с ошибкой:

int cannot be dereferenced

Теперь я понимаю, что примитивы не ссылочные типы (т.е. не является объектом), и поэтому не могут иметь методы. Тем не менее, Java 5 введена Autoboxing и распаковка (а-ля C # ..., который я никогда не любил в C #, но это рядом с точкой). Так с Autoboxing, я ожидал бы выше, чтобы преобразовать Минт к Integer, а затем вызвать ToString () на этом.

Кроме того, я считаю, C # позволяет такой вызов, если я не помню неправильно. Является ли это просто несчастный недостаток Autoboxing / распаковки спецификации в Java, или есть веские основания для этого?

Задан 07/08/2008 в 02:05
источник пользователем
На других языках...                            


8 ответов

голоса
45

Java Autoboxing / распаковка не идет в той степени , чтобы позволить вам разыменовать примитивный, так что ваш компилятор препятствует этому. Ваш компилятор знает еще myIntкак примитив. Там в документ по этому вопросу на jcp.org .

Autoboxing в основном полезен при назначении или передачи параметров - позволяет передать примитивный как объект (или наоборот), либо назначить примитивного к объекту (или наоборот).

Так, к сожалению, вам придется сделать это следующим образом: (престижность Патрик, я переключился на своем пути)

Integer.toString(myInt);
Ответил 07/08/2008 d 02:09
источник пользователем

голоса
27

То же самое на то, что сказал Джастин, но вы должны сделать это вместо того, чтобы:

Integer.toString(myInt);

Это экономит распределение или два и более читаемым.

Ответил 07/08/2008 d 02:16
источник пользователем

голоса
15

Еще один способ сделать это состоит в использовании:

String.valueOf(myInt);

Этот метод перегружен для каждого примитивного типа и Object. Таким образом , вы не должны даже думать о типе используемого вами. Реализации методы будут вызывать соответствующий метод данного типа для вас, например Integer.toString(myInt).

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

Ответил 10/08/2008 d 08:32
источник пользователем

голоса
9

кажется недостатком спецификации мне

Есть несколько недостатков , и это тонкая тема. Проверьте это из:

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);
   }
}

Здесь «длинный» будет напечатан (не проверял это сам), так как компилятор Choses расширение над Autoboxing. Будьте осторожны при использовании Autoboxing или не использовать его на всех!

Ответил 07/08/2008 d 05:16
источник пользователем

голоса
5

Допустимый синтаксис ближе всего к вашему примеру

((Integer) myInt).toString();

Когда заканчивается компилятор, что эквивалентно

Integer.valueOf(myInt).toString();

Однако, это не так хорошо , как обычное использование, String.valueOf(myInt), потому что, за исключением особых случаев, он создает новый экземпляр типа Integer, а затем сразу же выбрасывает его, в результате чего более ненужного мусора. (Небольшой диапазон целых чисел кэшируются, и доступ к доступа к массиву.) Возможно , разработчики языка хотел , чтобы препятствовать это использование соображений производительности.

Изменить: Я был бы благодарен, если downvoter (s) будет комментировать, почему это не полезно.

Ответил 24/09/2008 d 17:18
источник пользователем

голоса
1

Было бы полезно, если Java определены некоторые статические методы для работы с примитивными типами и встроенный в компилятор некоторый синтаксический сахар, так что

5.asInteger

было бы эквивалентно

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

Я не думаю, что такая функция может вызвать несовместимость с любым кодом, который компилируется в соответствии с действующими правилами, и это помогло бы уменьшить синтаксический беспорядок во многих случаях. Если Java были Autobox примитивов, которые были разыменованными, люди могли бы предположить, что это было отображением Разыменования синтаксиса статических вызовов методов (что эффективно, что происходит в .NET), и, таким образом, что операции, написанные в этой форме не были более дорогостоящими, чем это было бы эквивалентные статические вызовы методов. Добавление новой функции языка, который будет стимулировать человек писать плохой код (например, авто-бокс разыменованных примитивов) не кажется хорошей идеей, хотя позволяя методы разыменования стиля могут быть.

Ответил 31/01/2014 d 00:26
источник пользователем

голоса
1

Как всем отметил, Autoboxing позволяет упростить код, но вы не можете делать вид, что примитивы сложные типы.

Также интересно: «Autoboxing является компилятор уровня рубить» в Java. Autoboxing в основном странный ляп добавил на Java. Проверьте этот пост для более подробной информации о том , как это странно.

Ответил 23/01/2010 d 15:16
источник пользователем

голоса
1

В C #, целые числа не являются ни ссылочными типами и они не должны быть в штучной упаковке для того , чтобы ToString () будет называться. Они будут рассмотрены объекты в рамках (как ValueType, так что они имеют значение семантики), однако. В CLR, методы на примитивов называют «косвенно» загружать их в стек (ldind).

Ответил 10/09/2008 d 22:20
источник пользователем

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