通用方法定义包含<t extends =“”class =“”>尽管返回类型已定义?

时间:2016-03-03 09:39:50

标签: java generics

任何机构都能解释为什么<T extends Job>这里使用了类型安全的泛型吗?

此代码由我的项目团队成员编写,他不再是团队的一员。对我来说这看起来很奇怪Code。我只是想重写它并在另一个代码中使用它。没有深刻的理解,我将无法改变这一点。

    private <T extends Job> void addNewTask (Class<T> prm_objClassToSchedule, String prm_sJobName, String prm_sTriggerName, String prm_sCronExpression) throws ParseException, SchedulerException {
            CronTrigger v_objTrigger;
            JobDetail v_objJob;
            Scheduler v_objScheduler;
}

3 个答案:

答案 0 :(得分:3)

正如在其他答案中所说T应该扩展Job,所以方法可以清楚地写成:

private <T extends Job> void addNewTask (Class<T extends Job> prm_objClassToSchedule, String prm_sJobName, String prm_sTriggerName, String prm_sCronExpression) throws ParseException, SchedulerException {
            CronTrigger v_objTrigger;
            JobDetail v_objJob;
            Scheduler v_objScheduler;

java编译器至少需要提及相同泛型类型T的确切类型才能编译它,无论这个提及是在参数中还是在返回类型中。 T的所有其他提及将被解释为同一类。

答案 1 :(得分:1)

没有使用此方法的任何上下文。我想说第一个参数是期望从Job类扩展的Class类型。

答案 2 :(得分:1)

它声明第一个参数是Class<T> wheref T extends Job

class Job {

    public void go() {

    }
}

class X extends Job {
}

private <T extends Job> void addNewTask(Class<T> c) throws InstantiationException, IllegalAccessException {
    T t = c.newInstance();
    t.go();
}

public void test() throws InstantiationException, IllegalAccessException {
    Object o = new Object();
    Job j = new Job();
    X x = new X();
    // Not allowed because `o` is not a `Job`
    //addNewTask(o.getClass());
    // Both good.
    addNewTask(j.getClass());
    addNewTask(x.getClass());
}