diff --git a/numba/typed/listobject.py b/numba/typed/listobject.py
index 4f4071e51..379f12aba 100644
--- a/numba/typed/listobject.py
+++ b/numba/typed/listobject.py
@@ -1049,6 +1049,8 @@ def impl_extend(l, iterable):
             ty = iterable.item_type
         elif hasattr(iterable, "yield_type"):  # iterators and generators
             ty = iterable.yield_type
+        elif isinstance(iterable, types.UnicodeType):
+            ty = iterable
         else:
             raise TypingError("unable to extend list, iterable is missing "
                               "either *dtype*, *item_type* or *yield_type*.")

typed-list fails to refine via extend on unicode input
## Reporting a bug

- [x] I am using the latest released version of Numba (most recent is visible in
 the change log (https://github.com/numba/numba/blob/master/CHANGE_LOG).
- [x] I have included below a minimal working reproducer (if you are unsure how
 to write one see http://matthewrocklin.com/blog/work/2018/02/28/minimal-bug-reports).

Reproducer:

```python
from numba import njit
from numba.typed import List


@njit
def foo():
    l = List()
    l.extend("abc")
    return l


print(foo())
```

Stacktrace:

```
Traceback (most recent call last):
  File "/Users/vhaenel/git/numba/numba/core/typeinfer.py", line 149, in propagate
    constraint(typeinfer)
  File "/Users/vhaenel/git/numba/numba/core/typeinfer.py", line 486, in __call__
    self.resolve(typeinfer, typevars, fnty)
  File "/Users/vhaenel/git/numba/numba/core/typeinfer.py", line 506, in resolve
    sig = typeinfer.resolve_call(fnty, pos_args, kw_args)
  File "/Users/vhaenel/git/numba/numba/core/typeinfer.py", line 1440, in resolve_call
    return self.context.resolve_function_type(fnty, pos_args, kw_args)
  File "/Users/vhaenel/git/numba/numba/core/typing/context.py", line 214, in resolve_function_type
    raise last_exception
  File "/Users/vhaenel/git/numba/numba/core/typing/context.py", line 197, in resolve_function_type
    res = self._resolve_user_function_type(func, args, kws)
  File "/Users/vhaenel/git/numba/numba/core/typing/context.py", line 249, in _resolve_user_function_type
    return func.get_call_type(self, args, kws)
  File "/Users/vhaenel/git/numba/numba/core/types/functions.py", line 215, in get_call_type
    out = template.apply(args, kws)
  File "/Users/vhaenel/git/numba/numba/core/typing/templates.py", line 246, in apply
    sig = generic(args, kws)
  File "/Users/vhaenel/git/numba/numba/core/typing/templates.py", line 802, in generic
    sig = self._get_signature(self.context, fnty, args, kws)
  File "/Users/vhaenel/git/numba/numba/core/typing/templates.py", line 753, in _get_signature
    sig = fnty.get_call_type(typingctx, args, kws)
  File "/Users/vhaenel/git/numba/numba/core/types/functions.py", line 148, in get_call_type
    failures.raise_error()
  File "/Users/vhaenel/git/numba/numba/core/types/functions.py", line 77, in raise_error
    raise errors.TypingError(self.format())
numba.core.errors.TypingError: Invalid use of Function(<function impl_extend at 0x117b72b80>) with argument(s) of type(s): (ListType[undefined], unicode_type)
 * parameterized
In definition 0:
    TypingError: unable to extend list, iterable is missing either *dtype*, *item_type* or *yield_type*.
    raised from /Users/vhaenel/git/numba/numba/typed/listobject.py:1053
In definition 1:
    TypingError: unable to extend list, iterable is missing either *dtype*, *item_type* or *yield_type*.
    raised from /Users/vhaenel/git/numba/numba/typed/listobject.py:1053
This error is usually caused by passing an argument of a type that is unsupported by the named function.
[1] During: resolving callee type: BoundFunction((<class 'numba.core.types.containers.ListType'>, 'extend') for ListType[undefined])
[2] During: typing of call at foo/foo134.py (8)


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "foo/foo134.py", line 12, in <module>
    print(foo())
  File "/Users/vhaenel/git/numba/numba/core/dispatcher.py", line 401, in _compile_for_args
    error_rewrite(e, 'typing')
  File "/Users/vhaenel/git/numba/numba/core/dispatcher.py", line 342, in error_rewrite
    raise e
  File "/Users/vhaenel/git/numba/numba/core/dispatcher.py", line 353, in _compile_for_args
    return self.compile(tuple(argtypes))
  File "/Users/vhaenel/git/numba/numba/core/compiler_lock.py", line 32, in _acquire_compile_lock
    return func(*args, **kwargs)
  File "/Users/vhaenel/git/numba/numba/core/dispatcher.py", line 768, in compile
    cres = self._compiler.compile(args, return_type)
  File "/Users/vhaenel/git/numba/numba/core/dispatcher.py", line 81, in compile
    raise retval
  File "/Users/vhaenel/git/numba/numba/core/dispatcher.py", line 91, in _compile_cached
    retval = self._compile_core(args, return_type)
  File "/Users/vhaenel/git/numba/numba/core/dispatcher.py", line 104, in _compile_core
    cres = compiler.compile_extra(self.targetdescr.typing_context,
  File "/Users/vhaenel/git/numba/numba/core/compiler.py", line 548, in compile_extra
    return pipeline.compile_extra(func)
  File "/Users/vhaenel/git/numba/numba/core/compiler.py", line 328, in compile_extra
    return self._compile_bytecode()
  File "/Users/vhaenel/git/numba/numba/core/compiler.py", line 390, in _compile_bytecode
    return self._compile_core()
  File "/Users/vhaenel/git/numba/numba/core/compiler.py", line 370, in _compile_core
    raise e
  File "/Users/vhaenel/git/numba/numba/core/compiler.py", line 361, in _compile_core
    pm.run(self.state)
  File "/Users/vhaenel/git/numba/numba/core/compiler_machinery.py", line 335, in run
    raise patched_exception
  File "/Users/vhaenel/git/numba/numba/core/compiler_machinery.py", line 326, in run
    self._runPass(idx, pass_inst, state)
  File "/Users/vhaenel/git/numba/numba/core/compiler_lock.py", line 32, in _acquire_compile_lock
    return func(*args, **kwargs)
  File "/Users/vhaenel/git/numba/numba/core/compiler_machinery.py", line 290, in _runPass
    mutated |= check(pss.run_pass, internal_state)
  File "/Users/vhaenel/git/numba/numba/core/compiler_machinery.py", line 263, in check
    mangled = func(compiler_state)
  File "/Users/vhaenel/git/numba/numba/core/typed_passes.py", line 89, in run_pass
    typemap, return_type, calltypes = type_inference_stage(
  File "/Users/vhaenel/git/numba/numba/core/typed_passes.py", line 67, in type_inference_stage
    infer.propagate(raise_errors=raise_errors)
  File "/Users/vhaenel/git/numba/numba/core/typeinfer.py", line 985, in propagate
    raise errors[0]
numba.core.errors.TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Invalid use of Function(<function impl_extend at 0x117b72b80>) with argument(s) of type(s): (ListType[undefined], unicode_type)
 * parameterized
In definition 0:
    TypingError: unable to extend list, iterable is missing either *dtype*, *item_type* or *yield_type*.
    raised from /Users/vhaenel/git/numba/numba/typed/listobject.py:1053
In definition 1:
    TypingError: unable to extend list, iterable is missing either *dtype*, *item_type* or *yield_type*.
    raised from /Users/vhaenel/git/numba/numba/typed/listobject.py:1053
This error is usually caused by passing an argument of a type that is unsupported by the named function.
[1] During: resolving callee type: BoundFunction((<class 'numba.core.types.containers.ListType'>, 'extend') for ListType[undefined])
[2] During: typing of call at foo/foo134.py (8)


File "foo/foo134.py", line 8:
def foo():
    <source elided>
    l = List()
    l.extend("abc")
```
diff --git a/numba/tests/test_typedlist.py b/numba/tests/test_typedlist.py
index 9f26b1327..6ab938601 100644
--- a/numba/tests/test_typedlist.py
+++ b/numba/tests/test_typedlist.py
@@ -106,6 +106,17 @@ class TestTypedList(MemoryLeakMixin, TestCase):
         # index
         self.assertEqual(l.index(15), 4)
 
+    def test_list_extend_refines_on_unicode_type(self):
+        @njit
+        def foo(string):
+            l = List()
+            l.extend(string)
+            return l
+
+        for func in (foo, foo.py_func):
+            for string in ("a", "abc", "\nabc\t"):
+                self.assertEqual(list(func(string)), list(string))
+
     def test_unsigned_access(self):
         L = List.empty_list(int32)
         ui32_0 = types.uint32(0)

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-cov
apt-get update apt-get install -y gcc g++
3.7
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
certifi @ file:///croot/certifi_1671487769961/work/certifi
coverage==7.2.7
exceptiongroup==1.2.2
importlib-metadata==6.7.0
iniconfig==2.0.0
llvmlite==0.31.0
-e git+https://github.com/numba/numba.git@0f2f216484209c283108a31ebc57db4962ca6930#egg=numba
numpy==1.21.6
packaging==24.0
pluggy==1.2.0
pytest==7.4.4
pytest-cov==4.1.0
tomli==2.0.1
typing_extensions==4.7.1
zipp==3.15.0

name: numba
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=22.3.1=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - argparse==1.4.0
      - coverage==7.2.7
      - exceptiongroup==1.2.2
      - importlib-metadata==6.7.0
      - iniconfig==2.0.0
      - llvmlite==0.31.0
      - numpy==1.21.6
      - packaging==24.0
      - pluggy==1.2.0
      - pytest==7.4.4
      - pytest-cov==4.1.0
      - tomli==2.0.1
      - typing-extensions==4.7.1
      - zipp==3.15.0
prefix: /opt/conda/envs/numba

numba/tests/test_typedlist.py::TestTypedList::test_list_extend_refines_on_unicode_type
numba/tests/test_typedlist.py::TestTypedList::test_basic numba/tests/test_typedlist.py::TestTypedList::test_catch_global_typed_list numba/tests/test_typedlist.py::TestTypedList::test_compiled numba/tests/test_typedlist.py::TestTypedList::test_delitem_slice numba/tests/test_typedlist.py::TestTypedList::test_getitem_slice numba/tests/test_typedlist.py::TestTypedList::test_list_create_no_jit_using_List numba/tests/test_typedlist.py::TestTypedList::test_list_create_no_jit_using_empty_list numba/tests/test_typedlist.py::TestTypedList::test_setitem_slice numba/tests/test_typedlist.py::TestTypedList::test_setitem_slice_value_error numba/tests/test_typedlist.py::TestTypedList::test_unsigned_access numba/tests/test_typedlist.py::TestTypedList::test_unsigned_prange numba/tests/test_typedlist.py::TestNoneType::test_append_none numba/tests/test_typedlist.py::TestNoneType::test_equals_none numba/tests/test_typedlist.py::TestNoneType::test_getitem_none numba/tests/test_typedlist.py::TestNoneType::test_iter_none numba/tests/test_typedlist.py::TestNoneType::test_len_none numba/tests/test_typedlist.py::TestNoneType::test_none_typed_method_fails numba/tests/test_typedlist.py::TestNoneType::test_not_equals_none numba/tests/test_typedlist.py::TestNoneType::test_setitem_none numba/tests/test_typedlist.py::TestAllocation::test_allocation numba/tests/test_typedlist.py::TestAllocation::test_growth_and_shrinkage numba/tests/test_typedlist.py::TestExtend::test_extend_other numba/tests/test_typedlist.py::TestExtend::test_extend_self numba/tests/test_typedlist.py::TestExtend::test_extend_tuple numba/tests/test_typedlist.py::TestComparisons::test_empty_vs_empty numba/tests/test_typedlist.py::TestComparisons::test_empty_vs_singleton numba/tests/test_typedlist.py::TestComparisons::test_equal numba/tests/test_typedlist.py::TestComparisons::test_equals_non_list numba/tests/test_typedlist.py::TestComparisons::test_first_greater_than numba/tests/test_typedlist.py::TestComparisons::test_first_less_than numba/tests/test_typedlist.py::TestComparisons::test_first_shorter numba/tests/test_typedlist.py::TestComparisons::test_second_shorter numba/tests/test_typedlist.py::TestComparisons::test_singleton_vs_empty numba/tests/test_typedlist.py::TestComparisons::test_singleton_vs_singleton_equal numba/tests/test_typedlist.py::TestComparisons::test_singleton_vs_singleton_greater_than numba/tests/test_typedlist.py::TestComparisons::test_singleton_vs_singleton_less_than numba/tests/test_typedlist.py::TestListInferred::test_refine_extend_list numba/tests/test_typedlist.py::TestListInferred::test_refine_extend_set numba/tests/test_typedlist.py::TestListInferred::test_refine_list_extend_iter numba/tests/test_typedlist.py::TestListInferred::test_simple_refine_append numba/tests/test_typedlist.py::TestListInferred::test_simple_refine_insert numba/tests/test_typedlist.py::TestListRefctTypes::test_array_as_item_in_list numba/tests/test_typedlist.py::TestListRefctTypes::test_dict_as_item_in_list numba/tests/test_typedlist.py::TestListRefctTypes::test_dict_as_item_in_list_multi_refcount numba/tests/test_typedlist.py::TestListRefctTypes::test_equals_on_list_with_dict_for_equal_lists numba/tests/test_typedlist.py::TestListRefctTypes::test_equals_on_list_with_dict_for_unequal_dicts numba/tests/test_typedlist.py::TestListRefctTypes::test_equals_on_list_with_dict_for_unequal_lists numba/tests/test_typedlist.py::TestListRefctTypes::test_jitclass_as_item_in_list numba/tests/test_typedlist.py::TestListRefctTypes::test_list_as_item_in_list numba/tests/test_typedlist.py::TestListRefctTypes::test_list_as_value_in_dict numba/tests/test_typedlist.py::TestListRefctTypes::test_storage_model_mismatch numba/tests/test_typedlist.py::TestListRefctTypes::test_str_item numba/tests/test_typedlist.py::TestListRefctTypes::test_str_item_refcount_replace numba/tests/test_typedlist.py::TestListSort::test_sort_all_args numba/tests/test_typedlist.py::TestListSort::test_sort_dispatcher_key numba/tests/test_typedlist.py::TestListSort::test_sort_in_jit_w_global_key numba/tests/test_typedlist.py::TestListSort::test_sort_in_jit_w_lambda_key numba/tests/test_typedlist.py::TestListSort::test_sort_no_args numba/tests/test_typedlist.py::TestListSort::test_sort_on_arrays numba/tests/test_typedlist.py::TestImmutable::test_append_fails numba/tests/test_typedlist.py::TestImmutable::test_getitem_still_works_when_immutable numba/tests/test_typedlist.py::TestImmutable::test_is_immutable numba/tests/test_typedlist.py::TestImmutable::test_length_still_works_when_immutable numba/tests/test_typedlist.py::TestImmutable::test_make_immutable_is_immutable numba/tests/test_typedlist.py::TestImmutable::test_mutation_fails
numba/typed/listobject.py
numba/typed/listobject.py