无法从 Function<Short, Object> 转换为 Function<Short, Short>

问题描述

因此,这个大学练习要求编写一个方法,将 Function<Short,Short> 作为参数,结果类型为 Function<Short,Short>。它应该返回函数除以 9 的结果。 这是我写的代码,虽然我非常有信心它应该可以工作,但 eclipse 在第 16 行显示一个我根本不明白的错误

"Type mismatch: cannot convert from Function<Short,Object> to Function<Short,Short>. 

如果我把 Function<Integer,Integer> 放在两者中,或者如果我在返回类型上写 Function<Short,Object>,并且将参数保留为 Function,它工作正常。

public Function<Short,Short> ulmic(Function<Short,Short> period) {
   return period.andThen(a -> a / 9);
}

解决方法

为了让它工作,你必须写如下:

public Function<Short,Short> ulmic(Function<Short,Short> period) {
    return period.andThen(a -> (short) (a / 9));
}

当您将操作数 / 应用于 a9 时,Java 会将结果转换为整数。

Chapter 5. Conversions and Promotions 可以读到:

一个转换上下文是数字运算符的操作数,例如 + 要么 *。此类操作数的转换过程称为数字 晋升。促销的特殊之处在于,在二进制的情况下 运算符,为一个操作数选择的转换可能部分取决于 另一个操作数表达式的类型。

5.6.2. Binary Numeric Promotion

当运算符将二进制数字提升应用于一对 操作数,每个操作数必须表示一个可转换为 数字类型,以下规则依次适用:

如果任何操作数是引用类型,则对其进行拆箱 转化 (§5.1.8)。

扩展原语转换 (§5.1.2) 用于转换或 由以下规则指定的两个操作数:

  • 如果任一操作数的类型为 double,则另一个将转换为 double。

  • 否则,如果任一操作数是 float 类型,则转换另一个 漂浮。

  • 否则,如果任一操作数是 long 类型,则转换另一个 很长。

  • 否则,两个操作数都将转换为 int 类型。