有没有办法告诉 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 …