diff --git a/java/vector/src/main/java/org/apache/arrow/vector/complex/NonNullableStructVector.java b/java/vector/src/main/java/org/apache/arrow/vector/complex/NonNullableStructVector.java index 4da2668121a..7d724656cda 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/complex/NonNullableStructVector.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/complex/NonNullableStructVector.java @@ -374,6 +374,18 @@ public ValueVector getVectorById(int id) { return getChildByOrdinal(id); } + /** + * Gets a child vector by ordinal position and casts to the specified class. + */ + public V getVectorById(int id, Class clazz) { + ValueVector untyped = getVectorById(id); + if (clazz.isInstance(untyped)) { + return clazz.cast(untyped); + } + throw new ClassCastException("Id " + id + " had the wrong type. Expected " + clazz.getCanonicalName() + + " but was " + untyped.getClass().getCanonicalName()); + } + @Override public void setValueCount(int valueCount) { for (final ValueVector v : getChildren()) { diff --git a/java/vector/src/test/java/org/apache/arrow/vector/TestStructVector.java b/java/vector/src/test/java/org/apache/arrow/vector/TestStructVector.java index b4c30480000..552d5752f23 100644 --- a/java/vector/src/test/java/org/apache/arrow/vector/TestStructVector.java +++ b/java/vector/src/test/java/org/apache/arrow/vector/TestStructVector.java @@ -282,4 +282,12 @@ public void testAddChildVectorsWithDuplicatedFieldNamesForConflictPolicyReplace( } } + @Test + public void testTypedGetters() { + try (final StructVector s1 = StructVector.empty("s1", allocator)) { + s1.addOrGet("struct_child", FieldType.nullable(MinorType.INT.getType()), IntVector.class); + assertEquals(IntVector.class, s1.getChild("struct_child", IntVector.class).getClass()); + assertEquals(IntVector.class, s1.getVectorById(0, IntVector.class).getClass()); + } + } }