2012-01-03 5 views
-4

У меня есть следующий метод в public abstract class Model { //impl } (объявившего именно так):Общий метод абстрактного класса

protected <T extends Model> HashMap<String, Model> resultsetMap(ResultSet res) { 
    HashMap<String, Model> data = new HashMap<String, Model>(); 
    try { 
     while(res.next()) { 
      Model obj = T.getNew(res); 
      data.put(obj.toString(), obj); 
     } 
    } catch(SQLException e) { 
     return null; 
    } 
    return data; 
} 
  1. T должен вызывающему абоненту конкретный класс он должен использовать. Это возможно?
  2. Как я могу назвать этот метод из другого метода подкласса Model? Я попытался с resultsetMap<Course>(res);, но это выглядит как синтаксическая ошибка
+5

Что вы имеете в виду "возможно ли это?" Вы пытались скомпилировать его? –

+0

Нет, у меня нет, я опытный программист (еще не в java), и я хотел получить то, что у меня уже не было чувства к языку. Если меня не убьют, для меня это значит, что я на правильном пути: D – Flavius

+1

Его немного не по теме, но я бы порекомендовал вам вернуть карту вместо HashMap. Таким образом, вы разделяете реализацию и интерфейс. Затем вы можете изменить реализацию, не меняя интерфейс. – sandrozbinden

ответ

2

Поскольку метод наследуется, его можно назвать либо super.<ConcModel>resultsetMap(/* arg */);, либо this.<ConcModel>resultsetMap(/* arg */);. Второй или первый, соответственно, в зависимости от того, переопределяет ли этот подкласс или нет.

Tutorial on how to call a generic method.

+0

Я просто думал о «родовой» части - как сказать, что такое 'T'? – Flavius

+0

Для этого вам нужно использовать T как тип параметра метода. –

+0

Хорошо, так как указать 'T'? Я не знаю, что такое «тип параметра метода», покажите мне синтаксис. – Flavius

0

Вы не можете позвонить T.getNew(), так как тип T стираются во время выполнения. Вы можете передать объект класса, если вам нужно вызвать методы класса.

В вашем коде 'T' описывается тип, это не экземпляр ничего, поэтому вы не можете вызывать методы на нем. Если бы это был экземпляр объекта, вам все равно нужно было бы передать его в метод, если он должен быть статическим методом, который он не может быть переопределен.

Я хотел бы использовать шаблон фабрики, то есть передать заводскую модель этому методу.

+0

Будьте более конкретным пожалуйста. – Flavius

+0

Что делать, если 'getNew' - это метод в« Модели »? –

+0

Да 'getNew()' - это метод 'Model' и он перезаписывается этими подклассами. Разве это не то, что делает 'T extends Model'? – Flavius

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