Доступ к iterable с помощью ключа [duplicate]

Объект ответа возвращается клиенту в ответ на запрос, отправленный на сервер. Класс Response имеет внутренний класс Response.ResponseBuilder, который собирает все свойства, заданные в его поле типа Response.ResponseBuilder. Response.ResponseBuilder применяет шаблон проектирования Builder для построения объекта ответа.

Метод build () отвечает за подключение цепочки объектов Response.ResponseBuilder, сформированных в ходе сборки. Например,

Response.status(200);   

возвращает метод ответа Response.ResponseBuilder после назначения объекта объекта STATUS

 Response.status(200).entity( AnyObj );

объекта присваивается сущности (возвращаемая обратная связь) типа Response.ResponseBuilder и присваивается экземпляр Response. После этого статус также присваивает статус и возвращает экземпляр Response.ResponseBuilder. Строитель соединяет их во время вызова метода build ().

Response.status(200).entity( obj ).build(); 

Наконец, метод построения конструируется полностью (со свойствами, указанными) Response.

Теперь возникает вопрос о Объект GenericEntity. Он представляет объект ответа общего типа T.

Для экземпляра,

GenericEntity> obj = new GenericEntity> (lst) {}; Response.status (200) .entity (obj) .build ();

obj - тип списка, как указано выше. метод entity принимает тип объекта, который является общим. Если возникнет необходимость в конкретном типе, вы должны передать его в качестве аргумента типа GenericEntity, с помощью которого во время выполнения он передается объекту определенного типа.

Практическое использование

Требуется для my Jersey Framework для ответа JSON типа Array, который был объектом List в моей модели Java, возвращался к клиенту как часть объекта Response.

Поэтому новый GenericEntity> --- передает объект / полезную нагрузку в тип списка new GenericEntity --- тип выполнения становится String


Ресурс на стороне Webservice

public Response findAllFruits(@QueryParam("frtID") String frtID ) {

         List<String> lst = new ArrayList<String>();
         lst.add("Banana");
         lst.add("Apple");

         GenericEntity<List<String>> obj = new GenericEntity<List<String>>(lst) {};


          return Response.status(200).entity( obj ).build(); 

    } 

Выходной ответ отправляется обратно клиенту. [«Банан», «Яблоко»]


Как читать объект ответа

List<CustomType> myObj= response.readEntity(new GenericType<List<CustomType>>() {});
10
задан Supericy 11 February 2013 в 07:58
поделиться

3 ответа

Нет, нет «чистого» способа сделать это.

Тип array - это примитивный тип . Объекты, реализующие интерфейс ArrayAccess, основаны на классах, также известных как композитный тип . Нет никакого типа-намека, который охватывает оба.

Поскольку вы используете ArrayAccess в качестве массива, вы можете просто его бросить. Например:

$config = new Config;
$lol = new I_Use_A_Config( (array) $config);

Если это не опция (вы хотите использовать объект Config как есть), просто удалите подсказку типа и проверьте, что это либо массив, либо ArrayAccess. Я знаю, что вы хотели этого избежать, но это не очень важно. Это всего лишь несколько строк и, когда все сказано и сделано, несущественны.

11
ответ дан Sverri M. Olsen 18 August 2018 в 14:31
поделиться
  • 1
    Не тот ответ, на который я надеялся, но приведение к массиву на самом деле хорошая идея. благодаря – Supericy 11 February 2013 в 08:57
  • 2
    Это плохая практика, клиент не должен делать то, что может сделать библиотека. – danidacar 3 July 2014 в 12:09
  • 3
    Выделение объекта массиву не имеет значения, реализуется ли ArrayAccess или нет. AFAIK единственное, что изменит функциональность кастинга, - это подкласс класса ArrayObject. Надеюсь, что wiki.php.net/rfc/union_types делает это когда-нибудь (не связанный с кастингом, а с вопросом OP);) – Chelsea Urquhart 19 December 2015 в 15:26

Ну php поддерживает Type hinting для Array / Object. Поэтому массив должен работать нормально. Однако передача объекта ArrayAccess по методу, разрешенному только для типа массива, может вызывать ошибки. ArrayAccess используется в основном для целей итерации объекта ArrayAccess так же, как массив, как использование в foreach.

-3
ответ дан kuldeep.kamboj 18 August 2018 в 14:31
поделиться

У них есть реальное решение в PHP 7.1.

http://php.net/manual/en/migration71.new-features.php#migration71.new-features.iterable- псевдо-тип

Итерируемый псевдотип - это то, что вы хотите. Любой массив или тип Traversable (который является базовым интерфейсом для итераторов) проведет эту проверку.

Теперь, чтобы сделать это понятным для всех, кто хочет получить супер-глубину, да, быть краевыми случаями. Вы должны думать об этих крайних случаях и решать их самостоятельно, но если вы хотите убедиться, что если кто-то проходит через проходящий элемент, к которому нельзя получить доступ через ключ, вы можете это сделать.

http://php.net/manual/en/function.iterator-to-array.php

Теперь, независимо от того, что они передают в подсказке типа, у вас будет массив , но это может устранить преимущества использования генератора для уменьшения памяти. Это должно быть очевидно, но, видимо, это не так, так вот. Вы, программист, несете ответственность за выяснение своих конкретных случаев использования кода и того, как вы планируете его использовать, и для чего подходит код использования.

Поскольку это еще недостаточно ясно , скажем, вы пытаетесь передать что-то, что является типом, и ожидаете существования определенного метода или переменной, тогда вы плохо программируете. Вы должны выполнить контракт, у которого есть тип возвращаемого значения, который вы ищете, и передать его, а не общий тип. Если вы хотите сделать что-то общее, например, цикл, для чего нужны итерируемые типы. Подсказка в названии: Iterate.

-2
ответ дан Michael Ryan Soileau 18 August 2018 в 14:31
поделиться
  • 1
    Это не совсем правильный ответ. Traversable iterface не подразумевает, что данный объект реализует ArrayAccess (например, элементы могут быть доступны ключом). Вам все равно необходимо выполнить дополнительную проверку типа в вашем коде. – mancze 4 April 2017 в 11:45
  • 2
    Возникает вопрос: «разрешить массив или объект, который реализует ArrayAccess» Да, это позволит это. И да, это позволит вам получить к нему доступ через ключ для любого итеративного псевдотипа. К любому члену Iterator можно получить доступ через. ключ. Это определение: php.net/manual/en/class.iterator.php Подсказка: это тот, который называется key. – Michael Ryan Soileau 5 April 2017 в 00:13
  • 3
    1) Если вы интерпретируете этот вопрос таким образом, что объявление типа не будет соответствовать как ответ (оно позволяет array или ArrayAccess), но, безусловно, не является предполагаемым ответом, потому что это позволяет больше. То же самое касается iterable. 2) Осторожно - подсказка типа iterable означает array или Traversable, а не Iterator. Например, Generator - Traversable, но с помощью ключа невозможно получить доступ к значениям. И если вы посмотрите на пример - намерение состоит в том, чтобы указать объявление типа для конфигураций, где доступ через ключ, вероятно, является ожидаемой способностью данного параметра. – mancze 5 April 2017 в 08:40
  • 4
    3) И последнее Iterator невозможно получить через ключ. Метод key просто возвращает ключ текущей позиции указателя. Вы не можете сделать $iterator['user']. – mancze 5 April 2017 в 08:42
  • 5
    & quot; Если вы интерпретируете этот вопрос таким образом, чтобы объявление типа не соответствовало как ответ & quot; Вы не должны интерпретировать этот вопрос. Например, если это действительно вызывает огромную озабоченность, вы можете использовать php.net/manual/en/function.iterator-to-array.php и Presto! Задача решена! Вопрос заключается в подсказке типа, а не в определении метода. Любой, кто использует что-либо в определении метода, очевидно, должен будет рассмотреть краевые случаи его использования. Но это был не вопрос. И когда вы отвечаете на вопросы, вы должны ответить на вопрос. – Michael Ryan Soileau 5 April 2017 в 17:33
Другие вопросы по тегам:

Похожие вопросы: