Написание метода для принятия типа интерфейса вместо типа класса - PullRequest
11 голосов
/ 24 апреля 2011

Я пытаюсь создать некоторые классы, которые реализуют определенный интерфейс (в данном случае XYPlottable) и метод, который может обрабатывать любой класс, реализующий этот интерфейс.

Пока у меня есть следующее (это работает):

public interface XYPlottable {
    public Number getXCoordinate();
    public Number getYCoordinate();
    public Number getCoordinate(String fieldName);
}

public class A implements XYPlottable {
//Implements the above interface properly
...
}

public class B implements XYPlottable {
//Implements the above interface properly
...
}

Это отлично работает. У меня также есть метод, чтобы попытаться построить что-нибудь XYPlottable:

public static Frame createPlot(String title, String xAxisLabel, String yAxisLabel,
                               List<XYPlottable> points, boolean fitLine) {

Поэтому я пытаюсь использовать его с одним из указанных выше конкретных классов, и он жалуется на наличие несовместимых типов:

List<A> values = _controller.getValues(tripName);
XYPlotter.createPlot("Plot A", "B", "C", values, false);

Вот точная ошибка:

incompatible types
  required: java.util.List<XYPlottable>
  found:    java.util.List<A>

Я надеюсь, что у меня просто есть момент и я упускаю что-то действительно очевидное, но, возможно, у меня неправильное понимание того, как я должен использовать интерфейсы.

Ответы [ 3 ]

21 голосов
/ 24 апреля 2011

Объявление метода вроде следующего должно работать -

public static Frame createPlot(String title, String xAxisLabel, String yAxisLabel,
                               List<? extends XYPlottable> points, boolean fitLine) {

Обратите внимание на изменение параметра List<XYPlottable> на List<? extends XYPlottable> - это называется подстановочными знаками.Подробнее об общих подстановочных знаках здесь

7 голосов
/ 24 апреля 2011

Попробуйте:

List<? extends XYPlottable>

в объявлении метода.

Обобщения в Java могут сбивать с толку.

http://download.oracle.com/javase/tutorial/java/generics/index.html

0 голосов
/ 24 апреля 2011

Вы используете конкретный тип A в своем списке значений.Это должен быть список XYPlottables например

List<XYPlottable> value = _controller.getValues(tripName)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...