Java中令牌的含义是什么?

<?>从www.JavaPractices.com复制的此代码中的令牌是什么意思?当我用更<T>通用的泛型类型替换它时,它无法编译。(错误:T无法解析为类型。)为什么?

// <?> occurs 3 times in the entire program.  When it is replaced with <T> the

// program no longer compiles.

void activateAlarmThenStop()

{

Runnable myPeriodicTask = new PeriodicTask();

ScheduledFuture<?> soundAlarmFuture =

this.executorService.scheduleWithFixedDelay(myPeriodicTask,

startT,

period,

TimeUnit.SECONDS

);

Runnable stopAlarm = new StopAlarmTask(soundAlarmFuture);

this.executorService.schedule(stopAlarm, stopT, TimeUnit.SECONDS);

}

private final class StopAlarmTask implements Runnable

{

StopAlarmTask(ScheduledFuture<?> aSchedFuture)

{

fSchedFuture = aSchedFuture;

}

public void run()

{

CConsole.pw.println("Stopping alarm.");

fSchedFuture.cancel(doNotInterruptIfRunningFlag);

executorService.shutdown();

}

private ScheduledFuture<?> fSchedFuture;

}

编辑:当然,当我们使用类似的通用类型标记时<T>,它必须出现在类声明中。这里也没有<T>,也没有<?>在类的声明,但它仍然可以编译和运行正常。

回答:

它无法编译,因为您的类不是通用的(也不是您的任何方法)。在此特定示例中,小丑(?)表示ScheduledFuture可以由任何参数设置。

有时,如果您在内部使用另一个泛型类并且不知道将使用的确切类型,则使整个类成为泛型是没有意义的。在此示例中,您有三个选择:

  1. 使StopAlarmTask通用(在这种情况下没有意义)
  2. 在ScheduledFuture中使用具体类型,但是它只会是一种可能的结果类型,例如String或Integer
  3. 使用通配符(< ? >)-允许检索FutureResult(字符串,整数,自定义类)的结果。您还可以将可能的泛型类型的范围缩小为某些子类,例如ScheduledGeneric< ? extends MyObject >或为超类:ScheduledGeneric< ? super MyObject >

以上是 Java中令牌的含义是什么? 的全部内容, 来源链接: utcz.com/qa/423371.html

回到顶部