# Business Logic — KKW00121SF01DBean.typeModelData() [229 LOC]

| Field | Value |
|-------|-------|
| Fully Qualified Name | `eo.web.webview.KKW00121SF.KKW00121SF01DBean` |
| Layer | Service / UI Framework (webview layer within the X33V MVC framework) |
| Module | `KKW00121SF` (Package: `eo.web.webview.KKW00121SF`) |

## 1. Role

### KKW00121SF01DBean.typeModelData()

This method serves as a **dynamic type-introspection dispatcher** within the X33V view data binding framework. It resolves the Java runtime type (`Class<?>`) of individual field properties within one of eight array-based list data models, given a slash-delimited selector key (e.g., `"テンプレートID/0"`) and a sub-key identifying a nested property. The method implements a **routing/dispatch pattern** — it branches on the top-level list category (`key` argument), then delegates into the corresponding `X33VDataTypeList` at the specified index, calling `typeModelData(subkey)` on the element at that position to resolve the inner field's type.

This is a **shared UI framework utility** that enables the X33V data binding layer to perform runtime type checking during screen rendering and validation. It supports eight distinct array-list data categories used on the KKW00121SF screen: template ID entries, status entries, item checker errors, item IDs, screen IDs, message IDs, embedded text strings, and screen item IDs. Each category manages a list of `X33VDataTypeStringBean` objects, and the sub-key is passed to the bean's own `typeModelData` method to resolve individual property types.

The method's design follows the **X33V DataType delegation model** — the parent bean (`KKW00121SF01DBean`) delegates per-list-element type resolution to the element itself, enabling nested type introspection. It handles edge cases gracefully: null parameters, wildcard `*` indices (returning `Integer.class` to indicate the list's element count), non-numeric index strings, and out-of-range indices all resolve to `null`.

**Design patterns implemented:**
- **Routing/Dispatch** — branches on the `key` category string to select which data list to operate on.
- **Delegation** — after locating the correct element in the list, delegates type resolution to the element's own `typeModelData(subkey)` method.
- **Guard Clause** — early null checks and bounds validations prevent downstream errors.
- **Template Method (implicit)** — all eight list branches follow an identical code structure: extract sub-key, check wildcard, parse index, validate bounds, delegate.

**Role in the larger system:** This method is the type-resolution counterpart to the X33V framework's `getValue()` and `setValue()` methods. When the view layer needs to know "what type is field X on list element Y of category Z?", it calls this method. It is primarily used by the X33V data binding engine and any screen component that needs to perform type-aware validation or rendering of dynamically generated list data.

## 2. Processing Pattern (Detailed Business Logic)

```mermaid
flowchart TD
    START(["typeModelData key, subkey"])

    START --> CheckNull["key == null || subkey == null?"]
    CheckNull -->|Yes| RET_NULL1["return null"]
    CheckNull -->|No| SEP["sep = key.indexOf('/')"]

    SEP --> Branch1["key == テンプレートID?"]
    Branch1 -->|Yes| Parse1["Extract sub-key after '/'"]
    Parse1 --> Star1["sub-key == '*'?"]
    Star1 -->|Yes| RET_INT1["return Integer.class"]
    Star1 -->|No| Index1["Parse Integer from sub-key"]
    Index1 --> Catch1["NumberFormatException?"]
    Catch1 -->|Yes| RET_NULL2["return null"]
    Catch1 -->|No| Bounds1["index in template_id_list range?"]
    Bounds1 -->|No| RET_NULL3["return null"]
    Bounds1 -->|Yes| CALL1["delegate typeModelData(subkey)"]
    CALL1 --> CALL_RET1["return Class<?>"]

    Branch1 -->|No| Branch2["key == ステータス?"]
    Branch2 -->|Yes| Parse2["Extract sub-key after '/'"]
    Parse2 --> Star2["sub-key == '*'?"]
    Star2 -->|Yes| RET_INT2["return Integer.class"]
    Star2 -->|No| Index2["Parse Integer from sub-key"]
    Index2 --> Bounds2["index in status_list range?"]
    Bounds2 -->|No| RET_NULL4["return null"]
    Bounds2 -->|Yes| CALL2["delegate typeModelData(subkey)"]
    CALL2 --> CALL_RET2["return Class<?>"]

    Branch2 -->|No| Branch3["key == 項目チェッカー?"]
    Branch3 -->|Yes| Parse3["Extract sub-key after '/'"]
    Parse3 --> Star3["sub-key == '*'?"]
    Star3 -->|Yes| RET_INT3["return Integer.class"]
    Star3 -->|No| Index3["Parse Integer from sub-key"]
    Index3 --> Bounds3["index in item_check_err_list range?"]
    Bounds3 -->|No| RET_NULL5["return null"]
    Bounds3 -->|Yes| CALL3["delegate typeModelData(subkey)"]
    CALL3 --> CALL_RET3["return Class<?>"]

    Branch3 -->|No| Branch4["key == 項目ID?"]
    Branch4 -->|Yes| Parse4["Extract sub-key after '/'"]
    Parse4 --> Star4["sub-key == '*'?"]
    Star4 -->|Yes| RET_INT4["return Integer.class"]
    Star4 -->|No| Index4["Parse Integer from sub-key"]
    Index4 --> Bounds4["index in item_id_list range?"]
    Bounds4 -->|No| RET_NULL6["return null"]
    Bounds4 -->|Yes| CALL4["delegate typeModelData(subkey)"]
    CALL4 --> CALL_RET4["return Class<?>"]

    Branch4 -->|No| Branch5["key == 画面ID?"]
    Branch5 -->|Yes| Parse5["Extract sub-key after '/'"]
    Parse5 --> Star5["sub-key == '*'?"]
    Star5 -->|Yes| RET_INT5["return Integer.class"]
    Star5 -->|No| Index5["Parse Integer from sub-key"]
    Index5 --> Bounds5["index in gamen_id_list range?"]
    Bounds5 -->|No| RET_NULL7["return null"]
    Bounds5 -->|Yes| CALL5["delegate typeModelData(subkey)"]
    CALL5 --> CALL_RET5["return Class<?>"]

    Branch5 -->|No| Branch6["key == メッセージID?"]
    Branch6 -->|Yes| Parse6["Extract sub-key after '/'"]
    Parse6 --> Star6["sub-key == '*'?"]
    Star6 -->|Yes| RET_INT6["return Integer.class"]
    Star6 -->|No| Index6["Parse Integer from sub-key"]
    Index6 --> Bounds6["index in message_id_list range?"]
    Bounds6 -->|No| RET_NULL8["return null"]
    Bounds6 -->|Yes| CALL6["delegate typeModelData(subkey)"]
    CALL6 --> CALL_RET6["return Class<?>"]

    Branch6 -->|No| Branch7["key == 埋め込み文字列?"]
    Branch7 -->|Yes| Parse7["Extract sub-key after '/'"]
    Parse7 --> Star7["sub-key == '*'?"]
    Star7 -->|Yes| RET_INT7["return Integer.class"]
    Star7 -->|No| Index7["Parse Integer from sub-key"]
    Index7 --> Bounds7["index in replace_str_list range?"]
    Bounds7 -->|No| RET_NULL9["return null"]
    Bounds7 -->|Yes| CALL7["delegate typeModelData(subkey)"]
    CALL7 --> CALL_RET7["return Class<?>"]

    Branch7 -->|No| Branch8["key == 画面項目ID?"]
    Branch8 -->|Yes| Parse8["Extract sub-key after '/'"]
    Parse8 --> Star8["sub-key == '*'?"]
    Star8 -->|Yes| RET_INT8["return Integer.class"]
    Star8 -->|No| Index8["Parse Integer from sub-key"]
    Index8 --> Bounds8["index in screen_item_id_list range?"]
    Bounds8 -->|No| RET_NULL10["return null"]
    Bounds8 -->|Yes| CALL8["delegate typeModelData(subkey)"]
    CALL8 --> CALL_RET8["return Class<?>"]

    Branch8 -->|No| RET_NULL11["return null"]

    RET_NULL1 --> END_NODE(["End"])
    RET_NULL2 --> END_NODE
    RET_NULL3 --> END_NODE
    RET_NULL4 --> END_NODE
    RET_NULL5 --> END_NODE
    RET_NULL6 --> END_NODE
    RET_NULL7 --> END_NODE
    RET_NULL8 --> END_NODE
    RET_NULL9 --> END_NODE
    RET_NULL10 --> END_NODE
    RET_NULL11 --> END_NODE

    RET_INT1 --> END_NODE
    RET_INT2 --> END_NODE
    RET_INT3 --> END_NODE
    RET_INT4 --> END_NODE
    RET_INT5 --> END_NODE
    RET_INT6 --> END_NODE
    RET_INT7 --> END_NODE
    RET_INT8 --> END_NODE
    CALL_RET1 --> END_NODE
    CALL_RET2 --> END_NODE
    CALL_RET3 --> END_NODE
    CALL_RET4 --> END_NODE
    CALL_RET5 --> END_NODE
    CALL_RET6 --> END_NODE
    CALL_RET7 --> END_NODE
    CALL_RET8 --> END_NODE
```

**Branch summary:** Each of the 8 branches follows an identical 5-step pattern:
1. Extract the sub-key string after the `'/'` separator
2. Check if sub-key equals `"*"` (wildcard for list element count)
3. Parse the sub-key as an integer index
4. Validate the index is within the list's bounds `[0, list.size() - 1]`
5. Cast the element at that index to `X33VDataTypeStringBean` and delegate `typeModelData(subkey)` to it

## 3. Parameter Analysis

| No | Parameter Name | Type | Business Description |
|----|---------------|------|---------------------|
| 1 | `key` | `String` | A slash-delimited selector identifying which data list category and which index within that list to query. Format: `"CATEGORY_LABEL/INDEX"`. The category label (e.g., `"テンプレートID"`, `"ステータス"`) selects one of 8 array-based data lists maintained by this bean. The index portion (e.g., `0`, `*`) selects a specific element. Values: one of the 8 category strings followed by `"/" + non-negative integer index or "*"`. |
| 2 | `subkey` | `String` | A nested property selector passed to the delegate element's `typeModelData()` method. It identifies a specific field within the selected list element to resolve the type for. The exact values depend on the `X33VDataTypeStringBean` implementation. |

**Instance fields read by this method:**

| Field Name | Type | Business Description |
|-----------|------|---------------------|
| `template_id_list` | `X33VDataTypeList` | List of template ID entries — each element is an `X33VDataTypeStringBean` representing a template ID on the screen |
| `status_list` | `X33VDataTypeList` | List of status entries — each element is an `X33VDataTypeStringBean` representing a status value |
| `item_check_err_list` | `X33VDataTypeList` | List of item checker error entries — each element is an `X33VDataTypeStringBean` representing validation error messages for form fields |
| `item_id_list` | `X33VDataTypeList` | List of item ID entries — each element is an `X33VDataTypeStringBean` representing item identifiers |
| `gamen_id_list` | `X33VDataTypeList` | List of screen ID entries — each element is an `X33VDataTypeStringBean` representing screen identifiers |
| `message_id_list` | `X33VDataTypeList` | List of message ID entries — each element is an `X33VDataTypeStringBean` representing message identifiers |
| `replace_str_list` | `X33VDataTypeList` | List of embedded text string entries — each element is an `X33VDataTypeStringBean` representing text replacement values |
| `screen_item_id_list` | `X33VDataTypeList` | List of screen item ID entries — each element is an `X33VDataTypeStringBean` representing screen field identifiers |

## 4. CRUD Operations / Called Services

| CRUD | SC / CBS | SC Code | Entity / DB | Operation Description |
|------|----------|---------|-------------|----------------------|
| - | `X33VDataTypeList.get(int)` | N/A | In-memory data list | Retrieves the element at the specified index from the target `X33VDataTypeList`. This is an in-memory list operation, not a database call. |
| - | `X33VDataTypeStringBean.typeModelData(String)` | N/A | In-memory data bean | Delegates to the cast element's `typeModelData()` to resolve the nested field type. |

**Note:** This method performs **no database or SC-level CRUD operations**. It operates exclusively on in-memory `X33VDataTypeList` objects that were previously populated by other methods. All `substring`, `Integer.valueOf`, and bounds checks are pure Java operations.

## 5. Dependency Trace

| # | Caller (Screen/Batch) | Call Chain (Full Path to this Method) | Terminal (SC / CRUD / Entity) |
|---|----------------------|--------------------------------------|-------------------------------|
| 1 | Screen:KKW00121SF | `KKW00121SF01DBean.typeModelData(String, String)` | N/A (self-contained — no downstream DB/SC calls) |

**Callers from code graph analysis:** No external callers were identified in the dependency graph. The pre-computed evidence indicates that the only callers of this method are within the same class (`KKW00121SF01DBean`). This is consistent with its role as an internal X33V framework type-resolution method — it is invoked by the X33V view data binding framework rather than by business logic code directly.

## 6. Per-Branch Detail Blocks

### Block 1 — IF (null guard) `(key == null || subkey == null)` (L722)

> Guard clause: returns null if either parameter is null, preventing NullPointerException on subsequent string operations.

| # | Type | Code |
|---|------|------|
| 1 | EXEC | `key.indexOf("/")` — finds separator position |
| 2 | IF | `key == null \|\| subkey == null` |
| 3 | RETURN | `return null;` — early exit if key or subkey is null |

### Block 2 — IF/ELSE-IF CHAIN: テンプレートID (L730)

> Processes the "Template ID" (テンプレートID) array list category. (配列項目 "テンプレートID" (String型、アイテムID:template_id))

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("テンプレートID")` |
| 2 | SET | `key = key.substring(separaterPoint + 1)` — Extracts the sub-key after the `'/'` character. (keyの次の要素を取得) |
| 3 | IF | `key.equals("*")` — Checks if wildcard `*` is specified instead of an index. |
| 4 | RETURN | `return Integer.class;` — Returns Integer type to represent list element count. (インデックス値の代わりに"*"が指定されていたら、リストの要素数を返す) |
| 5 | IF | `Integer.valueOf(key)` — Attempts to parse sub-key as an integer index. Wrapped in try-catch for `NumberFormatException`. |
| 6 | CATCH | `NumberFormatException e` — If sub-key is not a valid number, returns null. (インデックス値が数値文字列でない場合は、ここでnullを返す) |
| 7 | IF | `tmpIndexInt == null` — Redundant null check after successful `valueOf()` parsing. |
| 8 | RETURN | `return null;` |
| 9 | SET | `tmpIndex = tmpIndexInt.intValue()` — Unboxes Integer to primitive int. |
| 10 | IF | `tmpIndex < 0 \|\| tmpIndex >= template_id_list.size()` — Validates index is within list bounds. (インデックス値がリスト個数-1を超えると、ここでnullを返す) |
| 11 | RETURN | `return null;` — Out-of-range index |
| 12 | CALL | `((X33VDataTypeStringBean)template_id_list.get(tmpIndex)).typeModelData(subkey)` — Retrieves element at index, casts to `X33VDataTypeStringBean`, delegates type resolution. |

### Block 3 — IF/ELSE-IF CHAIN: ステータス (L760)

> Processes the "Status" (ステータス) array list category. (配列項目 "ステータス" (String型、アイテムID:status))

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `key.equals("ステータス")` |
| 2 | SET | `key = key.substring(separaterPoint + 1)` — Extracts the sub-key after `'/'`. |
| 3 | IF | `key.equals("*")` → `return Integer.class;` |
| 4 | IF | `Integer.valueOf(key)` wrapped in try-catch → `return null;` on exception |
| 5 | IF | `tmpIndexInt == null` → `return null;` |
| 6 | SET | `tmpIndex = tmpIndexInt.intValue()` |
| 7 | IF | `tmpIndex < 0 \|\| tmpIndex >= status_list.size()` → `return null;` |
| 8 | CALL | `((X33VDataTypeStringBean)status_list.get(tmpIndex)).typeModelData(subkey)` |

### Block 4 — IF/ELSE-IF CHAIN: 項目チェッカー (L787)

> Processes the "Item Checker" (項目チェッカー) array list category. (配列項目 "項目チェッカー" (String型、アイテムID:item_check_err))

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `key.equals("項目チェッカー")` |
| 2 | SET | `key = key.substring(separaterPoint + 1)` |
| 3 | IF | `key.equals("*")` → `return Integer.class;` |
| 4 | IF | `Integer.valueOf(key)` wrapped in try-catch → `return null;` |
| 5 | IF | `tmpIndexInt == null` → `return null;` |
| 6 | SET | `tmpIndex = tmpIndexInt.intValue()` |
| 7 | IF | `tmpIndex < 0 \|\| tmpIndex >= item_check_err_list.size()` → `return null;` |
| 8 | CALL | `((X33VDataTypeStringBean)item_check_err_list.get(tmpIndex)).typeModelData(subkey)` |

### Block 5 — IF/ELSE-IF CHAIN: 項目ID (L814)

> Processes the "Item ID" (項目ID) array list category. (配列項目 "項目ID" (String型、アイテムID:item_id))

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `key.equals("項目ID")` |
| 2 | SET | `key = key.substring(separaterPoint + 1)` |
| 3 | IF | `key.equals("*")` → `return Integer.class;` |
| 4 | IF | `Integer.valueOf(key)` wrapped in try-catch → `return null;` |
| 5 | IF | `tmpIndexInt == null` → `return null;` |
| 6 | SET | `tmpIndex = tmpIndexInt.intValue()` |
| 7 | IF | `tmpIndex < 0 \|\| tmpIndex >= item_id_list.size()` → `return null;` |
| 8 | CALL | `((X33VDataTypeStringBean)item_id_list.get(tmpIndex)).typeModelData(subkey)` |

### Block 6 — IF/ELSE-IF CHAIN: 画面ID (L841)

> Processes the "Screen ID" (画面ID) array list category. (配列項目 "画面ID" (String型、アイテムID:gamen_id))

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `key.equals("画面ID")` |
| 2 | SET | `key = key.substring(separaterPoint + 1)` |
| 3 | IF | `key.equals("*")` → `return Integer.class;` |
| 4 | IF | `Integer.valueOf(key)` wrapped in try-catch → `return null;` |
| 5 | IF | `tmpIndexInt == null` → `return null;` |
| 6 | SET | `tmpIndex = tmpIndexInt.intValue()` |
| 7 | IF | `tmpIndex < 0 \|\| tmpIndex >= gamen_id_list.size()` → `return null;` |
| 8 | CALL | `((X33VDataTypeStringBean)gamen_id_list.get(tmpIndex)).typeModelData(subkey)` |

### Block 7 — IF/ELSE-IF CHAIN: メッセージID (L868)

> Processes the "Message ID" (メッセージID) array list category. (配列項目 "メッセージID" (String型、アイテムID:message_id))

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `key.equals("メッセージID")` |
| 2 | SET | `key = key.substring(separaterPoint + 1)` |
| 3 | IF | `key.equals("*")` → `return Integer.class;` |
| 4 | IF | `Integer.valueOf(key)` wrapped in try-catch → `return null;` |
| 5 | IF | `tmpIndexInt == null` → `return null;` |
| 6 | SET | `tmpIndex = tmpIndexInt.intValue()` |
| 7 | IF | `tmpIndex < 0 \|\| tmpIndex >= message_id_list.size()` → `return null;` |
| 8 | CALL | `((X33VDataTypeStringBean)message_id_list.get(tmpIndex)).typeModelData(subkey)` |

### Block 8 — IF/ELSE-IF CHAIN: 埋め込み文字列 (L895)

> Processes the "Embedded Text String" (埋め込み文字列) array list category. (配列項目 "埋め込み文字列" (String型、アイテムID:replace_str))

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `key.equals("埋め込み文字列")` |
| 2 | SET | `key = key.substring(separaterPoint + 1)` |
| 3 | IF | `key.equals("*")` → `return Integer.class;` |
| 4 | IF | `Integer.valueOf(key)` wrapped in try-catch → `return null;` |
| 5 | IF | `tmpIndexInt == null` → `return null;` |
| 6 | SET | `tmpIndex = tmpIndexInt.intValue()` |
| 7 | IF | `tmpIndex < 0 \|\| tmpIndex >= replace_str_list.size()` → `return null;` |
| 8 | CALL | `((X33VDataTypeStringBean)replace_str_list.get(tmpIndex)).typeModelData(subkey)` |

### Block 9 — IF/ELSE-IF CHAIN: 画面項目ID (L922)

> Processes the "Screen Item ID" (画面項目ID) array list category. (配列項目 "画面項目ID" (String型、アイテムID:screen_item_id))

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `key.equals("画面項目ID")` |
| 2 | SET | `key = key.substring(separaterPoint + 1)` |
| 3 | IF | `key.equals("*")` → `return Integer.class;` |
| 4 | IF | `Integer.valueOf(key)` wrapped in try-catch → `return null;` |
| 5 | IF | `tmpIndexInt == null` → `return null;` |
| 6 | SET | `tmpIndex = tmpIndexInt.intValue()` |
| 7 | IF | `tmpIndex < 0 \|\| tmpIndex >= screen_item_id_list.size()` → `return null;` |
| 8 | CALL | `((X33VDataTypeStringBean)screen_item_id_list.get(tmpIndex)).typeModelData(subkey)` |

### Block 10 — ELSE (no matching category) (L948)

> Returns null when no matching category is found. (条件に一致するプロパティが存在しない場合は、nullを返す。)

| # | Type | Code |
|---|------|------|
| 1 | ELSE | (implicit fall-through — no final `else` clause in source) |
| 2 | RETURN | `return null;` — No matching category found for the given key |

## 7. Glossary

| Term | Type | Business Meaning |
|------|------|------------------|
| `テンプレートID` | Field (Japanese) | Template ID — identifier for a template entry in the list data model. Category label for `template_id_list`. |
| `template_id_list` | Field | Template ID list — an `X33VDataTypeList` containing `X33VDataTypeStringBean` elements representing template ID values. |
| `ステータス` | Field (Japanese) | Status — represents status entries on the screen. Category label for `status_list`. |
| `status_list` | Field | Status list — an `X33VDataTypeList` containing `X33VDataTypeStringBean` elements representing status values. |
| `項目チェッカー` | Field (Japanese) | Item Checker — validation error entries for form fields. Category label for `item_check_err_list`. |
| `item_check_err_list` | Field | Item checker error list — holds validation error messages for screen input fields. |
| `項目ID` | Field (Japanese) | Item ID — identifier for item entries. Category label for `item_id_list`. |
| `item_id_list` | Field | Item ID list — an `X33VDataTypeList` containing `X33VDataTypeStringBean` elements representing item identifiers. |
| `画面ID` | Field (Japanese) | Screen ID — identifier for screen entries. Category label for `gamen_id_list`. |
| `gamen_id_list` | Field | Screen ID list — an `X33VDataTypeList` containing `X33VDataTypeStringBean` elements representing screen identifiers. (`gamen` = 画面, screen/display) |
| `メッセージID` | Field (Japanese) | Message ID — identifier for message entries. Category label for `message_id_list`. |
| `message_id_list` | Field | Message ID list — an `X33VDataTypeList` containing `X33VDataTypeStringBean` elements representing message identifiers. |
| `埋め込み文字列` | Field (Japanese) | Embedded text string — replacement text values. Category label for `replace_str_list`. |
| `replace_str_list` | Field | Embedded text string list — an `X33VDataTypeList` containing `X33VDataTypeStringBean` elements representing text replacement values. |
| `画面項目ID` | Field (Japanese) | Screen Item ID — identifier for screen field entries. Category label for `screen_item_id_list`. |
| `screen_item_id_list` | Field | Screen item ID list — an `X33VDataTypeList` containing `X33VDataTypeStringBean` elements representing screen field identifiers. |
| `X33VDataTypeList` | Framework class | X33V framework list type — a generic list container used in the X33V view data binding framework to hold typed data beans. |
| `X33VDataTypeStringBean` | Framework class | X33V string data bean — a typed data bean within the X33V framework, representing a string-typed field with type introspection support. |
| `X33VListedBeanInterface` | Framework interface | X33V listed bean contract — interface marking a bean as supporting list-based data binding. |
| `X33VDataTypeBeanInterface` | Framework interface | X33V data type bean contract — interface marking a bean as providing type introspection for its fields. |
| `*` (wildcard) | Value | A special string value used in place of an index to request the list's element count type (`Integer.class`). |
| key | Parameter | A slash-delimited selector string in the format `"CATEGORY/INDEX"` used to identify a specific list element and its nested field. |
| subkey | Parameter | A nested property selector passed to the delegate element to resolve the type of a specific field within that element. |
| `NumberFormatException` | Exception | Java standard exception thrown when `Integer.valueOf()` receives a non-numeric string. Caught and suppressed by returning null. |
