Java: Generics не будет работать для моего метода, что еще я могу сделать? - PullRequest
2 голосов
/ 06 марта 2009

В приведенном ниже коде я хотел бы, чтобы второй метод также был универсальным, но поскольку я создаю объект Calendar внутри метода, из-за стирания типа , я не вижу как . Одной из возможностей было бы передать объект Calendar, но это лишило бы смысла использование этого метода вообще (не думая об объектах Calendar).

Как заставить второй метод работать для нескольких подклассов Календаря, как первый метод?

public static <U extends Calendar> CalendarMatch<U> tpFromCalendar(U dt)
{
    // we want to do all comparisons on UTC calendars
    dt.setTimeZone(TimeZone.getTimeZone(DEFAULT_TZ_ID));
    return new CalendarMatch<U>(dt);
}

public static CalendarMatch<GregorianCalendar> tpDailyGregorian(int h)
{
    GregorianCalendar dt = new GregorianCalendar(TimeZone.getTimeZone(DEFAULT_TZ_ID));
    dt.clear();
    dt.set(Calendar.HOUR, h);

    // this works because of type inference
    return tpFromCalendar(dt);
}

Ответы [ 2 ]

5 голосов
/ 06 марта 2009

Здесь абсолютно не нужно использовать отражение. Так что не надо!

public static <U extends Calendar> CalendarMatch<U> tpDailyGregorian(
    int h, CalendarFactory<U> factory
) {
    Calendar dt = factory.create(TimeZone.getTimeZone(DEFAULT_TZ_ID));
    dt.clear();
    dt.set(Calendar.HOUR, h);

    // this works because of type inference
    return tpFromCalendar(dt);
}

Где:

public interface CalendarFactory<U extends Calender {
     U create(TimeZone timeZone);
}
3 голосов
/ 06 марта 2009

Подпись может быть:

public static <U extends Calendar> CalendarMatch<U> tpDailyGregorian(int h, Class<? extends U> clazz);

Один из способов - использовать отражение для создания экземпляра вашего календаря (передавая тип Calendar):

Constructor<? extends U> c = clazz.getContructor(TimeZone.class);
U dt = c.newInstance(TimeZone.getTimeZone(DEFAULT_TZ_ID));

Конечно, с этим экземпляром dt вы можете вызывать методы только на Calendar, а не GregorianCalendar

dt.clear();
dt.set(Calendar.HOUR, h);

Date d = dt.getGregorianChange(); //CANNOT CALL THIS!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...