2013-08-17 5 views
0

У меня есть интерфейс Vector из библиотеки, которые я использую в моем проекте, и я не могу изменить ...Переопределить метод с нежелательным суперкласса аргументом

interface Vector<T> { 
    public Vector<T> plus(Vector<T> v); 
} 

Тогда я реализовал ее с классом FourVector, но проблема возникает в переопределяющий метод плюс. Я хочу FourVector может добавить только с FourVector, а не со всеми типами векторов! То, что я пытаюсь сделать, это вещь, как это (но, очевидно, неправильно)

class FourVector<T> implements Vector<T> { 
    public Vector<T> plus(FourVector<T> v) { 
    ... 
    } 
} 

Существует некоторый шаблон или обходной путь, который позволяет реализовать эту идею?

+1

Так что FourVector представляет собой 4-мерный вектор? Если да, как вы можете узнать, какие размеры добавить, когда вы добавляете к нему 2D-вектор? – Tharwen

+0

Да, это представляет собой четырехмерный вектор Минковского. Infact, я хочу предотвратить этот тип несоответствий в переопределяющих методах ... – bluePhlavio

ответ

1

Если у вас есть Vector<T>, во время компиляции вы сможете передать любые Vector<T> его методу add. Так разработан интерфейс.

Так что ваш FourVector не в этом отношении реальной Vector:

  • либо вы принимаете, что и не осуществляют Vector
  • или вы можете добавить проверку выполнения: if (!(v instanceof FourVector)) throw new UnsupportedOperationException("Only FourVector allowed here");
0

Я улучшу первый правильный комментарий.

С другой стороны, вам разрешено переопределить метод следующим образом:

@Override 
public FourVector<T> plus(Vector<T> v) { 
    return null; 
} 

Вы должны понимать, что интерфейс был определен с помощью подписи. Вам также необходимо понять, что ваше поведение будет очень запутанным. Просто посмотрите на следующий код:

public void a() { 
    Vector<T> vector = new FourVector<>(); 
    b(vector); 
} 

public void b(Vector<T> v) { 
    v.plus(new ThreeVector<T>()); 
} 

Как разработчик знает, что даже даже если свойство типа Vector в методе b, это на самом деле FourVector и метод plus принимает только FourVector «s. Метод b каким-то образом знает точный тип данного свойства. Но, по-видимому, это противоречит предложению универсального метода в общем интерфейсе.

Смежные вопросы