Допустим, у меня есть этот базовый класс:
abstract public class Base {
abstract public Map save();
abstract public void load(Map data);
}
к моему удивлению, я мог бы сделать это в производном классе:
public class Derived extends Base {
@Override
public Map<String, String> save() { //Works
...
}
...
}
но я не смог этого сделать:
public class Derived extends Base {
@Override
public void load(Map<String, String> data) { // Fails
...
}
...
}
Что здесь происходит? Почему я могу использовать специализированный тип возвращаемого значения, а не специализированный тип параметра?
Что еще более запутанно, так это то, что если я сохраню исходное объявление load
, я могу просто присвоить его более специальному типу:
public class Derived extends Base {
@Override
public void load(Map data) {
Map<String, String> myData = data; // Works without further casting
...
}
...
}