Как Spring может получить информацию общего типа во время выполнения, касающуюся «строго типизированной коллекции»? - PullRequest
0 голосов
/ 11 марта 2012

Я прочитал ниже в документе Spring 3.0:

Коллекция со строгим шрифтом (только Java 5+)

В Java 5 и более поздних версиях вы можетеиспользовать строго типизированные коллекции (используя универсальные типы).То есть можно объявить тип Collection так, чтобы он мог содержать только элементы String (например).Если вы используете Spring для зависимой вставки строго типизированной коллекции в bean-компонент, вы можете воспользоваться преимуществами поддержки преобразования типов в Spring, так что элементы ваших строго типизированных экземпляров Collection преобразуются в соответствующий тип перед добавлением вКоллекция.

public class Foo {

  private Map<String, Float> accounts;

  public void setAccounts(Map<String, Float> accounts) {
      this.accounts = accounts;
  }
}

<beans>
  <bean id="foo" class="x.y.Foo">
      <property name="accounts">
          <map>
              <entry key="one" value="9.99"/>
              <entry key="two" value="2.75"/>
              <entry key="six" value="3.99"/>
          </map>
      </property>
  </bean>
</beans>

Когда свойство account объекта foo подготовлено для внедрения, общая информация о типе элемента карты со строгой типизацией доступна для:отражение. Таким образом, инфраструктура преобразования типов в Spring распознает различные элементы значения как имеющие тип Float, а строковые значения 9.99, 2.75 и 3.99 преобразуются в фактический тип Float.

как можноэто будет возможно?Как я знаю, информация общего типа стирается во время компиляции.

1 Ответ

6 голосов
/ 11 марта 2012

Это работает, потому что типы стираются для объектов, но не для полей.Взгляните на Где универсальные типы хранятся в файлах классов Java? для подробного объяснения, как это работает.

По сути, существует метод Field.getGenericType()Введенный в (сюрприз) 1.5, который всегда возвращает надежный универсальный тип поля.Поэтому Spring способен считывать accounts универсальные типы (<String, Float>) посредством простого отражения.

Обратите внимание, что тот же механизм используется, например, в .Это полностью допустимо и работает:

@Entity
public class Customer {

    @OneToMany
    private Set<Order> orders;

}

@Entity
public class Order {

    @Id
    private Integer id;

}

Без этой функции Java 5 провайдер JPA не смог бы выяснить, что является второй стороной orders один ко многим отношения.

...