У меня есть эта проблема: метод не переопределяет метод из своего суперкласса. Но я уверен, что мой код должен работать.

У меня есть интерфейс «Добавляемый» и класс «Пользователь», который реализует интерфейс. В интерфейсе есть только один метод:

 public void addToDatabase(Addable addable, Connection connection) throws SQLException;

А реализация этого метода выглядит так:

public void addToDatabase(User user, Connection connection) throws SQLException{
// some code here
}

Разве это не правильно, если пользователь реализует добавляемого пользователя, он также должен быть добавляемым?

-3
Ivan 1 Окт 2022 в 21:33
Пользователь является Addable, но Addable не является пользователем. Это не та подпись.
 – 
Dave Newton
1 Окт 2022 в 21:43
Просто измените пользователя на Adorable во втором методе
 – 
notAPPP
1 Окт 2022 в 21:44

2 ответа

Лучший ответ

Если вы можете сделать это в общем виде, вы можете сделать что-то вроде этого:

interface your_interface<T extends Adorable> {  
    public void addToDatabase(T t, Connection connection ) throws SQLException;  
}

class class_implements_your_interface implements your_interface<User> {  
    @Override   
    public void addToDatabase(User user, Connection connection ) throws SQLException {} 
}
1
notAPPP 1 Окт 2022 в 21:51
1
Спасибо, это работает
 – 
Ivan
1 Окт 2022 в 22:02

Да, если User реализует Addable, каждый экземпляр User также является экземпляром Addable.

К сожалению, это отношение не имеет значения при определении сигнатуры метода. Если метод в реализующем классе должен соответствовать объявлению, он должен иметь точную сигнатуру.

В вашем случае определение в классе должно выглядеть так:

@Override
public void addToDatabase( Addable user, Connection connection ) throws SQLException
{
  // some code here
  …
}

Только возвращаемое значение может отличаться тем, что оно может быть подклассом из объявления в интерфейсе. Но нет допустимого подкласса void.

А для реализации вы можете опустить предложение throws, которое может быть указано в объявлении.

1
tquadrat 1 Окт 2022 в 21:49
И как я могу решить проблему?
 – 
Ivan
1 Окт 2022 в 21:43
Я удалил свой комментарий, так как вы обновили свой ответ и добавили два исключения, которые я имел в виду. Есть плюс :-)
 – 
Alex R
1 Окт 2022 в 21:51