Java реализует метод интерфейса с использованием подтипа

#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 from getDataObject , однако подпись метода должна быть записана 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. Нет и нет. Расширение интерфейса ничего не дает, поскольку контракт базового интерфейса все равно должен быть выполнен. Ваш интерфейс просто невозможно выполнить. Создание универсального интерфейса возможно, но это в основном похоже на написание пользовательского интерфейса для каждой реализации, и тогда в чем смысл?