2012-05-05 2 views
0

У меня есть класс Employee и класс Building.
Эти классы не связаны друг с другом с точки зрения иерархии классов.
Мне нужно обработать кучу и Building объектов, и их результаты попадут в разные списки.
Итак, у меня есть и интерфейс, например.Определение интерфейса и дженерики. Должно ли это определяться по-разному?

public interface Processor{ 
    public void process(String s, List<?> result); 
} 

Идея заключается в том, что строка s несет в себе информацию, относящуюся либо к Employee или Building и реализации после того, как некоторая обработка добавляет к списку результатов либо в качестве Employee объекта или Building объекта.
Существует 2 варианта Processor один из них - EmployeeProcessor и BuildingProcessor.
Где-то в коде я получаю ссылку на любой из них, и я передаю либо List<Employee>, либо List<Building> в метод process.

Проблема в том, что код не компилируется.
Когда я это сделаю, например. внутри EmployeeProcessor: result.add(new Employee(a,b,c,d));
я получаю:

Метод добавления (? захвата # 2-в) в списке типов не применяется для аргументов

Я думаю, я могу понять проблема, но я не хочу менять интерфейс:

public interface Processor{ 
    public process(String s, List result); 
} 

Т.е. Т.е. не указывать тип списка.
Есть ли способ обойти эту проблему? Не определено ли определение интерфейса?
Примечание: этот интерфейс является частью реализации Command pattern

+0

1. Опубликовать сообщение об ошибке. 2. Опубликуйте свой фактический код - не фрагменты, которые даже не действительны Java ... – thkala

+0

@thkala: 1) Нет сообщения об ошибке. Показатель компилятора Eclipse 2) Что значит недействительный java? – Cratylus

+0

1. Это не «указание». Это полномасштабное сообщение об ошибке компилятора. 2. 'public process (String s, List result);' не является допустимым объявлением метода - нет возвращаемого типа ... – thkala

ответ

3

Это то, о чем я думал.

interface Processor<T>{ 
    public void process(String s, List<T> result); 
} 

class BuildingProcessor implements Processor<Building>{ 
    @Override 
    public void process(String s, List<Building> result) { 
     result.add(new Building()); 
    } 
} 

class EmployeeProcessor implements Processor<Employee>{ 
    @Override 
    public void process(String s, List<Employee> result) { 
     result.add(new Employee()); 
    } 
} 

FYI, вы можете дополнительно ограничить тип. Например, если классы Building и Employee реализуют, скажем, Processable, то вы можете сделать interface Processor<T extends Processable>

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