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

Тема в разделе "Java", создана пользователем Louis, 25 май 2008.

Статус темы:
Закрыта.
  1. Louis

    Louis Гость

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

    }

    Код (Text):
    public abstract class First implements IMath {
    int a;
    int b;
    }
    Код (Text):
    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.");
    }
    }
    Ругается что не переопределил все абстрактые методы...
    принимает только
    Код (Text):
    public Object sum(Object i, Object j) {
    throw new UnsupportedOperationException("Not supported yet.");
    }
    Что нужно сделать что бы заработала строка
    Код (Text):
    public Second sum(Second i, Second j)
     
  2. Yason

    Yason Гость

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

    Louis Гость

    rsum - это описка))

    везде sum
     
  4. Yason

    Yason Гость

    Судя по тому, что написано вот здесь, всех наследников тоже придётся параметризовать.
    Код (Text):
    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.
     
  5. Creo

    Creo Гость

    Если честно не знаю, что ты хотел в итоге получть, и как ты собираешься складывадь два объекта секонд.... Но что бы получилось примерно то, что ты написал сверху, то вот
    Код (Text):
    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-а), то нужно, что бы сам класс, который имплементирует интерфейс был параметризирован.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей