@PublicEvolving
    public static <IN1, IN2, OUT> TypeInformation<OUT> getCoGroupReturnTypes(
            CoGroupFunction<IN1, IN2, OUT> coGroupInterface,
            TypeInformation<IN1> in1Type,
            TypeInformation<IN2> in2Type) {
        return getCoGroupReturnTypes(coGroupInterface, in1Type, in2Type, null, false);
    }
@SuppressWarnings({"rawtypes", "unchecked"})
    @Test
    void testBasicArray() {
        // use getCoGroupReturnTypes()
        RichCoGroupFunction<?, ?, ?> function =
                new RichCoGroupFunction<String[], String[], String[]>() {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public void coGroup(
                            Iterable<String[]> first,
                            Iterable<String[]> second,
                            Collector<String[]> out)
                            throws Exception {
                        // nothing to do
                    }
                };

        TypeInformation<?> ti =
                TypeExtractor.getCoGroupReturnTypes(
                        function,
                        (TypeInformation) TypeInformation.of(new TypeHint<String[]>() {}),
                        (TypeInformation) TypeInformation.of(new TypeHint<String[]>() {}));

        assertThat(ti.isBasicType()).isFalse();
        assertThat(ti.isTupleType()).isFalse();

        // Due to a Java 6 bug the classification can be slightly wrong
        assertThat(
                        ti instanceof BasicArrayTypeInfo<?, ?>
                                || ti instanceof ObjectArrayTypeInfo<?, ?>)
                .isTrue();

        if (ti instanceof BasicArrayTypeInfo<?, ?>) {
            assertThat(ti).isEqualTo(BasicArrayTypeInfo.STRING_ARRAY_TYPE_INFO);
        } else {
            assertThat(((ObjectArrayTypeInfo<?, ?>) ti).getComponentInfo())
                    .isEqualTo(BasicTypeInfo.STRING_TYPE_INFO);
        }
    }