• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Параметризованный интерфейс

  • Автор темы Louis
  • Дата начала
Статус
Закрыто для дальнейших ответов.
L

Louis

Код:
public interface IMath<T> {
public T sum (T i, T j);

}


Код:
public abstract class First implements IMath {
int a;
int b;
}

Код:
public class Second extends First {

public Second(){
super.a = 1;
super.b = 2;
}
@Override
public String toString(){
String s="a = "+a+"; b = "+b;
return s;
}

public Second sum(Second i, Second j) {
throw new UnsupportedOperationException("Not supported yet.");
} 
}

Ругается что не переопределил все абстрактые методы...
принимает только
Код:
public Object sum(Object i, Object j) {
throw new UnsupportedOperationException("Not supported yet.");
}

Что нужно сделать что бы заработала строка
Код:
public Second sum(Second i, Second j)
 
Y

Yason

Эээ... если так нужно, чтобы в наследнике было именно rsum, очевидно, нужно определить (пустой?) sum. Ну, или в интерфейсе задавать rsum, а не sum.
Или я чего-то не понимаю?..
 
Y

Yason

Судя по тому, что написано , всех наследников тоже придётся параметризовать.
Код:
public abstract class First<T> implements IMath<T> {
...
}

public class Second<T> extends First<T> {
...
public T sum(T i, T j) {
throw new UnsupportedOperationException("Not supported yet.");
} 
}
Ну а в Second.sum() уже проверять равенство типа T типу Second.
 
C

Creo

Если честно не знаю, что ты хотел в итоге получть, и как ты собираешься складывадь два объекта секонд.... Но что бы получилось примерно то, что ты написал сверху, то вот
Код:
public interface IMath<T extends Second> {
T sum(T a, T b);
}

public abstract class First implements IMath<Second> {
int a;
int b;
}

public class Second extends First {
public Second() {
super.a=1;
super.b=2;
}
public Second sum(Second a, Second b) {
return new Second();
}
}

При имплементации интерфейса должен быть подставлен реальный класс, т.к. у себя ты ничего не написал то компилятор по умолчанию расценил это как First implements IMath<Object>, по этому и ругался на всё остальное...

А вообще тема интересная, если хочешь, что бы и в наследиках твоего интерфейса били параметры(как в премерах Yason-а), то нужно, что бы сам класс, который имплементирует интерфейс был параметризирован.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!