У меня есть следующие иерархии интерфейсов типа-роскопия и одна реализации:Java выпуск дженерик с перегруженными методами
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);
}
Теперь я пытаюсь вызвать метод calc() намеренно w Ith два различных типа Float и целое, как это:
try {
calculate(2.2f,2, new OperationFloat());
} catch (Exception e) {
System.out.println(e.getMessage());
}
После того, как я это называю, Java продолжает со ссылкой на добавление (Float, Float) метод и не может видеть перегруженный метод добавления (Float, Integer).
IDEA предлагает «Неконтролируемый призыв добавить (T, T) в качестве члена сырого типа ...»
Как изменить мои интерфейсы/классы, чтобы иметь возможность использовать перегруженный метод, как я хочу?
Это интересно. Я думал, что Java увидит '2' как int и будет использовать подпись Integer. Что происходит, когда вы завершаете '2' в' Integer (2) '? –
'add (Float, Integer)' не является частью интерфейса. Почему Java должен использовать этот метод, если вы работаете с интерфейсом 'OperationNumeric'? – Turing85
Возможный дубликат [Перегрузка метода перегрузки на основе реального типа параметра] (http://stackoverflow.com/questions/1572322/overloaded-method-selection-based-on-the-parameters-real-type) – Tom