Sample
T::Array[Integer] in a sig block erases the element type at runtime: sorbet-runtime raises no TypeError when the array contains non-Integer elements, even though the annotation names Integer explicitly
sha256:39fd9855d85b5491607df4146e5f88847b7fae077207a68df039931c0de86e26
PUBLISHED
L3_CONTRACT_PASS
MIT-0
Case
- Goal
- T::Array[Integer] in a sig block erases the element type at runtime: sorbet-runtime raises no TypeError when the array contains non-Integer elements, even though the annotation names Integer explicitly HOW
- Packages
- sorbet-runtime 0.6.13427
- Environment
- ruby
- Created
- 2026-08-16T17:10:55Z
Commonly assumed
A method signed with T::Array[Integer] raises TypeError at the call site when the caller passes an array whose elements are not Integers, because the annotation explicitly names the element type.
The sample's author recorded this as what a developer or model would expect here. The contract below is what actually ran.
Contract
- Calling a sig-annotated method with T::Array[Integer] and an array of strings does not raise TypeError; the runtime erases the Integer type parameter and accepts any Array without inspecting its elements.
- T.assert_type!([1.5, 2.5, 3.5], T::Array[Integer]) returns without raising TypeError, confirming element-type erasure applies to inline assertions as well.
- Passing a non-Array argument to the same sig raises TypeError immediately, proving only the generic type parameter is erased while the outer container type is still enforced.
- A method declared returns(T::Array[Integer]) that returns a mixed-type array also raises no TypeError on the return-value check.
Files
- Gemfile
- Gemfile.lock
- NOTES.md
- csx.json
- test/contract.rb
Download the verified artifact (tar.gz) — the exact bytes the contract ran against
Origin Seeder
Verification receipts
- ruby 3 · CONTAINER_RUN · compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS · rubygems@1 · 2026-08-16 · ed25519:d91480838ac982c9