/*
 * TypedMap class.
 *
 * Copyright (C) 2011 SATOH Takayuki All Rights Reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */
package ts.util;

import java.math.BigDecimal;
import java.util.List;

/**
 * キーに結びつけられた値オブジェクトを型変換して取得するためのメソッドを
 * 宣言するインターフェイス。
 *
 * @author 佐藤隆之
 * @version 1.0, 2011/05/27.
 */
public interface TypedGetter<K>
{
  /**
   * 指定されたキーに結びつけられた値オブジェクトを<tt>boolean</tt>に変換して
   * 取得する。
   *
   * @param key キー。
   * @return <tt>boolean</tt>型に変換された値。
   */
  boolean getBoolean(K key);

  /**
   * 指定されたキーに結びつけられた値オブジェクトを<tt>int</tt>型に変換して
   * 取得する。
   *
   * @param key キー。
   * @return <tt>int</tt>型に変換された値。
   */
  int getInteger(K key);

  /**
   * 指定されたキーに結びつけられた値オブジェクトを<tt>long</tt>型に変換して
   * 取得する。
   * <br>
   * 値オブジェクトが存在しない場合やヌルの場合は<tt>0</tt>を返す。
   *
   * @param key キー。
   * @return <tt>long</tt>型に変換された値。
   */
  long getLong(K key);

  /**
   * 指定されたキーに結びつけられた値オブジェクトを<tt>float</tt>型に変換して
   * 取得する。
   * <br>
   * 値オブジェクトが存在しない場合やヌルの場合は<tt>0.0</tt>を返す。
   *
   * @param key キー。
   * @return <tt>float</tt>型に変換された値。
   */
  float getFloat(K key);

  /**
   * 指定されたキーに結びつけられた値オブジェクトを<tt>double</tt>型に変換して
   * 取得する。
   * <br>
   * 値オブジェクトが存在しない場合やヌルの場合は<tt>0.0</tt>を返す。
   *
   * @param key キー。
   * @return <tt>double</tt>型に変換された値。
   */
  double getDouble(K key);

  /**
   * 指定されたキーに結びつけられた値オブジェクトを{@link BigDecimal}
   * オブジェクトに変換して取得する。
   * <br>
   * 値オブジェクトが存在しない場合やヌルの場合は値が<tt>0</tt>の{@link
   * BigDecimal}オブジェクトを返す。
   *
   * @param key キー。
   * @return {@link BigDecimal}オブジェクト。
   */
  BigDecimal getBigDecimal(K key);

  /**
   * 指定されたキーに結びつけられた値オブジェクトを文字列オブジェクトに変換して
   * 取得する。
   * <br>
   * 値オブジェクトが存在しない場合やヌルの場合は空文字列を返す。
   *
   * @param key キー。
   * @return 文字列オブジェクトに変換された値オブジェクト。
   */
  String getString(K key);

  /**
   * 指定されたキーに結びつけられた値オブジェクトを、指定された数値書式文字列を
   * 使って文字列オブジェクトに変換して取得する。
   * <br>
   * 指定されたキーに結びつけられた値オブジェクトを数値に変換できなかった場合は
   * 空文字列を返す。
   *
   * @param key キー。
   * @param format 数値書式文字列。
   * @return 文字列オブジェクトに変換された値オブジェクト。
   */
  String getNumberString(K key, String formatString);

  /**
   * 指定されたキーに結びつけられた値オブジェクトを、指定された日時書式文字列を
   * 使って文字列オブジェクトに変換して取得する。
   * <br>
   * 指定されたキーに結びつけられた値オブジェクトを日時に変換できなかった場合は
   * 空文字列を返す。
   *
   * @param key キー。
   * @param format 日時書式文字列。
   * @return 文字列オブジェクトに変換された値オブジェクト。
   */
  String getDateTimeString(K key, String formatString);

  /**
   * 指定されたキーに結びつけられた値オブジェクトを日時オブジェクトに変換して
   * 取得する。
   *
   * @param key キー。
   * @return 日時オブジェクトに変換された値オブジェクト。
   */
  DateTime getDateTime(K Key);

  /**
   * 指定されたキーに結びつけられた値オブジェクトをリスト・オブジェクトに変換
   * して取得する。
   * <br>
   * 結びつけられている値オブジェクトが単値の場合は、その値オブジェクトを唯一の
   * 要素とするリスト・オブジェクトを作成して返す。
   *
   * @param key キー。
   * @return {@link List}オブジェクトに変換された値オブジェクト。
   */
  List<? extends Object> getList(K key);
}
