【发布时间】:2016-09-29 13:28:36
【问题描述】:
我有以下类型化接口的层次结构和一个实现:
public interface Operation<T> {
T add(T object1, T object2);
}
public interface OperationNumeric<T extends Number> extends Operation<T> {
T add(T number1, T number2);
}
这个实现带有一个重载方法add():
public class OperationFloat implements OperationNumeric<Float> {
public Float add(Float number1, Float number2) {
return number1+number2;
}
public Float add(Float number1, Integer number2) {
return number1+number2;
}
}
现在我有一个使用 OperationNumericInterface 的方法:
public Number calculate(Number operand1, Number operand2, OperationNumeric operand) throws Exception {
return operand.add(operand1, operand2);
}
现在我正在尝试使用两种不同类型的 Float 和 Integer 故意调用 calculate(),如下所示:
try {
calculate(2.2f,2, new OperationFloat());
} catch (Exception e) {
System.out.println(e.getMessage());
}
一旦我调用它,Java 一直引用 add(Float, Float) 方法,看不到重载的方法 add(Float, Integer)。
IDEA 建议“未经检查地调用 add(T, T) 作为原始类型的成员 ...”
如何修改我的接口/类以便能够根据需要使用重载方法?
【问题讨论】:
-
这很有趣。我认为 Java 会将
2视为 int 并使用Integer签名。将2包裹在Integer(2)中会发生什么? -
add(Float, Integer)不是界面的一部分。如果在OperationNumeric接口上操作,Java为什么要调用这个方法? -
Q&A 与这个有点相关,因为您应该知道方法调用是如何“选择”的。但是 Turing85 也是对的,编译不会看到重载版本,因为它不是接口的一部分。
标签: java generics overloading