#java #oop
#java #ооп
Вопрос:
Я пытаюсь реализовать пользовательский интерфейс Java, используя подтип объекта.
Следовательно, у нас есть интерфейс:
public interface Information_Object {
public Data_Object getDataObject(String string);
public void putDataObject(String string, Data_Object d);
}
Фрагмент класса реализации:
public class HashmapBackedInformationObject implements Information_Object {
private static DigitalObjectRegistry newDigitalObjectRegistry = new DigitalObjectRegistry();
public DigitalObject getDataObject(String DOID) {
return newDigitalObjectRegistry.getDataObjectMap().get(DOID);
}
public void putDataObject(String DOID, DigitalObject dataObject) {
newDigitalObjectRegistry.getDataObjectMap().put(DOID, dataObject);
}
}
Проблема в том, что компилятор сообщает, что getDataObject(String DOID)
amp; putDataObject(String string, Data_Object d)
не реализованы.
DigitalObject является дочерним / подтипом Data_Object.
Как можно обеспечить реализацию интерфейса с использованием дочернего типа?
Спасибо
Комментарии:
1. Ваша реализация должна соответствовать интерфейсу, метод для метода. Никаких изменений в подписи. Вы можете вернуть
DigitalObject
fromgetDataObject
, однако подпись метода должна быть записанаpublic Data_Object getDataObject() { return someDigitalObject; }
Еще один совет, если вы аннотируете свои методы с помощью @Override , тогда вы заранее узнаете, что у вас проблема. НАПРИМЕР.,@Override public Data_Object getDataObject() {...}
Ответ №1:
Вы не можете.
getDataObject
Метод должен работать; не уверен, почему вы получаете сообщение об ошибке. Вы уверены, что правильно сообщаете об ошибке?
Однако putDataObject
это просто неправильно. В контракте Information_Object
указано, что любая реализация интерфейса может принимать any Data_Object
в качестве аргумента. Однако реализация в HashmapBackedInformationObject
указывает, что она принимает только DigialObject
s. Это ошибка при правильной реализации интерфейса.
В терминах информатики аргументы метода не являются ковариантными, но вы пытаетесь сделать их такими.
Комментарии:
1. таким образом, одним из решений является расширение
Information_Object
интерфейса вDigital_Information_Object
интерфейс, если методы имеют типDigialObject
, а неDataObject
. Что вы думаете?2. Другим решением является использование дженериков и параметризация вашего интерфейса
3. Нет и нет. Расширение интерфейса ничего не дает, поскольку контракт базового интерфейса все равно должен быть выполнен. Ваш интерфейс просто невозможно выполнить. Создание универсального интерфейса возможно, но это в основном похоже на написание пользовательского интерфейса для каждой реализации, и тогда в чем смысл?