@PublicEvolving
    public static <IN, OUT> TypeInformation<OUT> getFlatMapReturnTypes(
            FlatMapFunction<IN, OUT> flatMapInterface, TypeInformation<IN> inType) {
        return getFlatMapReturnTypes(flatMapInterface, inType, null, false);
    }
@SuppressWarnings({"unchecked", "rawtypes"})
    @Test
    void testTuple0() {
        // use getFlatMapReturnTypes()
        RichFlatMapFunction<?, ?> function =
                new RichFlatMapFunction<Tuple0, Tuple0>() {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public void flatMap(Tuple0 value, Collector<Tuple0> out) throws Exception {
                        // nothing to do
                    }
                };

        TypeInformation<?> ti =
                TypeExtractor.getFlatMapReturnTypes(
                        function, (TypeInformation) TypeInformation.of(new TypeHint<Tuple0>() {}));

        assertThat(ti.isTupleType()).isTrue();
        assertThat(ti.getArity()).isZero();
        assertThat(ti).isInstanceOf(TupleTypeInfo.class);
    }