2012-05-08 3 views
2

Я использую следующее заявление в Java коде, и я был удивлен, увидев, что он на самом деле составляет:Может кто-нибудь объяснить это использование примитивного типа в generics в Java?

ResponseEntity<byte[]> responseEntity = restTemplate.getForEntity(url.toString(), byte[].class, params); 

Сигнатуры этого метода из Документов:

ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> urlVariables) 

Я под впечатлением, что вы не можете использовать примитивы в generics в Java. Если да, то как это работает? Является ли это по существу синтаксическим сахаром для чего-то еще, что происходит под капотом? Моя (скорее всего, неверная) догадка заключается в том, что компилятор преобразует byte[] в Array и как-то работает с этим. Мне было интересно, может ли кто-нибудь объяснить мне, как и почему это работает.

ответ

13

Я думаю, это потому, что массивы на самом деле являются объектами (ссылочными типами) на Java, они являются непосредственными подтипами Object. Таким образом, дженерики работают для них как для любого ссылочного типа Java.

+10

Другими словами, массивы примитивных значений не являются примитивными типами – Snicolas

+1

А, круто! Спасибо за объяснение - это имеет смысл. ** edit: ** Если вы собираетесь снизить этот ответ, по крайней мере, любезность объяснить, почему. –

-5

Это около «обертки» для практических целей. Я имею в виду, что, несмотря на то, что вы используете примитивные типы (int или byte), вы создаете объект (знаете, new зарезервированное слово указывает, что вы создаете объект).

-5

Я предполагаю, что вы используете JDK 5 или выше. Если это так, то cos-автобоксинг используется для преобразования примитивного байта [] в Byte [] внутренне.

+3

Я боюсь, что это не так. –

+6

Ничего общего с автобоксированием. – Krrose27

+2

Это неверно, массивы не примитивы (как объяснил Виктор Сорокин), поэтому автооблок не происходит. – Uhlen