Как исправить? - "оба определяют getObjectCopy(), но с несвязанными типами возврата" - но это *one* функция
У меня есть следующий интерфейс heirarchy (со всеми несущественными функциями удалены). Я получаю эту ошибку при попытке скомпилировать ее:
types ValidLineGettable and ValidateValue<java.lang.String> are incompatible; both define getObjectCopy(), but with unrelated return types
Все это происходит от одной и той же функции - это не две разные функции с одинаковым именем, одна и та же функция в одном интерфейсе. Как вы имеете дело с интерфейсами, которые должны наследоваться от двух разных интерфейсов, которые сами должны наследовать от единственного базового интерфейса?
Я нашел два SO вопроса о разных функциях с одинаковым именем.
- Наследовать метод с несвязанными типами возврата
- Java - столкновение имени метода в реализации интерфейса
В моем случае это одна и та же функция, как концептуально, так и по названию.
(Хотя меня интересуют мнения о том, Copyable
интерфейс - хорошая идея для начала... он состоит из большого количества кода, который я использую, и он хорошо сработал для меня... меня больше всего интересует общий вопрос наследования / проектирования.)
Я не знаю, как лучше всего с этим справиться. Буду признателен за любые советы. Спасибо.
public interface Copyable {
Copyable getObjectCopy();
}
interface ValidateValue<O> extends Copyable {
//Other functions...
@Override
ValidateValue<O> getObjectCopy();
}
//For classes that may be able to be Decorated into a TextLineValidator
interface ValidLineGettable extends Copyable {
//Other functions...
ValidLineGettable getObjectCopy();
}
interface TextLineValidator extends ValidateValue<String>, ValidLineGettable {
//Other functions...
@Override
TextLineValidator getObjectCopy();
}
Ошибка:
C:\java_code\Copyable.java:17: types ValidLineGettable and ValidateValue<java.lang.String> are incompatible; both define getObjectCopy(), but with unrelated return types
interface TextLineValidator extends ValidateValue<String>, ValidLineGettable {
^
1 error
Tool completed with exit code 1
2 ответа
Предполагая, что все возвращаемые значения расширяются Copyable
, все версии getObjectCopy() возвращают Copyable. Например:
public interface ValidateValue<O> extends Copyable
{
// Other functions...
@Override
Copyable getObjectCopy();
}
public Blammy implements ValidateValue<String>
{
// Other functions...
@Override
public Copyable getObjectCopy()
{
SomethingThatExtendsCopyable blammy = new SomethingThatExtendsCopyable();
return (Copyable)blammy;
}
}
редактировать
В приведенном выше коде ошибка вызвана тем, что метод "getObjectCopy" имеет другое возвращаемое значение в ValidateValue<String>
а также ValidLineGettable
интерфейсы, но вызывающая подпись такая же. В Java вы не получите полиморфизм, изменив только возвращаемое значение; это приводит к ошибке компиляции.
Если вы измените возвращаемое значение на Copyable
тогда TextLineValidator
больше не приобретает ценность, расширяя оба его родительских интерфейса. Более простой подход состоит в том, чтобы иметь один интерфейс (Copyable) и несколько классов, которые реализуют этот интерфейс, каждый из которых возвращает значение Copyable, которое может быть экземпляром класса, который расширяет (или реализует) Copyable.
Компилятор Eclipse компилирует ваш код без ошибок. JavaC из JDK 7 (1.7.0_45) и JDK 8 (1.8.0-ea) также работают.
Я думаю, что это ошибка в JDK, скорее всего, она связана с ошибкой # 122881 (обратите внимание, что эта ошибка исправлена). Я также обнаружил проблему в буфере протокола Google, которая указывает на другую ошибку, но я не могу ее найти.
Вы можете скомпилировать его с помощью Eclipse или JDK 7 или изменить код так, чтобы он не требовал этой функции.