Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:泛型赢得';我的方法不行,我还能做什么?_Java_Generics - Fatal编程技术网

Java:泛型赢得';我的方法不行,我还能做什么?

Java:泛型赢得';我的方法不行,我还能做什么?,java,generics,Java,Generics,在下面的代码中,我也希望第二个方法是泛型的,但由于我在该方法中创建了Calendar对象,因为,我不知道如何创建。一种可能是传入Calendar对象,但这将完全违背使用此方法的主要目的(不必考虑Calendar对象) 如何使第二种方法与第一种方法一样适用于日历的多个子类? public static <U extends Calendar> CalendarMatch<U> tpFromCalendar(U dt) { // we want to do all c

在下面的代码中,我也希望第二个方法是泛型的,但由于我在该方法中创建了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);
}
公共静态日历匹配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);
}