Java:泛型赢得';我的方法不行,我还能做什么?
在下面的代码中,我也希望第二个方法是泛型的,但由于我在该方法中创建了Calendar对象,因为,我不知道如何创建。一种可能是传入Calendar对象,但这将完全违背使用此方法的主要目的(不必考虑Calendar对象) 如何使第二种方法与第一种方法一样适用于日历的多个子类?Java:泛型赢得';我的方法不行,我还能做什么?,java,generics,Java,Generics,在下面的代码中,我也希望第二个方法是泛型的,但由于我在该方法中创建了Calendar对象,因为,我不知道如何创建。一种可能是传入Calendar对象,但这将完全违背使用此方法的主要目的(不必考虑Calendar对象) 如何使第二种方法与第一种方法一样适用于日历的多个子类? public static <U extends Calendar> CalendarMatch<U> tpFromCalendar(U dt) { // we want to do all c
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);
}
公共静态日历匹配tpFromCalendar(U dt)
{
//我们希望在UTC日历上进行所有比较
dt.setTimeZone(TimeZone.getTimeZone(默认的z_ID));
返回新日历匹配(dt);
}
公共静态日历匹配tpDailyGregorian(整数h)
{
GregorianCalendar dt=新的GregorianCalendar(TimeZone.getTimeZone(默认的z_ID));
dt.clear();
dt.set(日历小时,h);
//这是因为类型推断
从日历返回tpFromCalendar(dt);
}
签名可以是:
public static <U extends Calendar> CalendarMatch<U> tpDailyGregorian(int h, Class<? extends U> clazz);
当然,对于这个dt
实例,您只能调用Calendar
上的方法,而不能调用gregoriacalendar
dt.clear();
dt.set(Calendar.HOUR, h);
Date d = dt.getGregorianChange(); //CANNOT CALL THIS!
这里绝对没有必要使用反射。所以不要
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);
}
公共静态日历匹配tpDailyGregorian(
int h,日历工厂
) {
Calendar dt=factory.create(TimeZone.getTimeZone(默认的z_ID));
dt.clear();
dt.set(日历小时,h);
//这是因为类型推断
从日历返回tpFromCalendar(dt);
}
其中:
public interface CalendarFactory<U extends Calender {
U create(TimeZone timeZone);
}
public interface CalendarFactory这是真的,但是每个calendar子类必须有一个CalendarFactory类。显然,这对Calendar来说不是一个大问题,但(显然)对其他泛型类(例如EnumSet)来说是一个问题。尽管Java的语法非常糟糕,但编写匿名内部类也不算太糟糕。
public interface CalendarFactory<U extends Calender {
U create(TimeZone timeZone);
}