小编Mar*_*cca的帖子

使用方法引用和原始类型进行类型推断

有没有办法告诉 Java 不要尝试从使用原始类型的方法引用推断类型?

这是我写的一个方法,这个原因现在无关紧要:

    public static <F, T> Predicate<F> isEquals(
            Function<F, T> aInMapFunction, T aInExpectedValue)
    {
        return aInActual -> Objects.equals(
                aInMapFunction.apply(aInActual), aInExpectedValue);
    }
Run Code Online (Sandbox Code Playgroud)

现在,如果您将方法引用传递给返回原始类型的“isEquals”会怎样?

Predicate<String> lLengthIs20 = isEquals(String::length, 20);
Run Code Online (Sandbox Code Playgroud)

这一切都很好,只是 Java 也会接受这种奇怪的用法:

Predicate<String> lLengthIs20 = isEquals(String::length, "what the heck?!?!?");
Run Code Online (Sandbox Code Playgroud)

这是因为编译器会将类型参数 T 推断为“ Serializable & Comparable<? extends Serializable & Comparable<?>>”,它将接受 Integer 和 String 类型。

在我的情况下,这是不可取的,因为我想要一个编译错误而不是 Java 找出一些疯狂的类型参数。就我而言,我还可以显式覆盖方法“isEquals”以采用特定的原始类型。例如:

    public static <F> Predicate<F> isEquals(
            ToIntFunction<F> aInMapFunction, int aInExpectedValue)
    {
        return aInActual ->
                aInMapFunction.applyAsInt(aInActual) == aInExpectedValue;
    }
Run Code Online (Sandbox Code Playgroud)

这工作正常,当我传入一个返回原始 int 的方法时,将调用此方法而不是 Object 方法。问题是我仍然需要 Object …

java generics type-inference

8
推荐指数
1
解决办法
304
查看次数

标签 统计

generics ×1

java ×1

type-inference ×1